主干 + 咖啡脚本 + Rails 应用程序初始化问题(2 级命名空间):无法读取未定义的属性'IndexView'



我是Backbone + Coffeescript + Rails的新手,我被困在初始化应用程序上。咖啡main_app.js是:

#= require_self
#= require_tree ./templates
#= require_tree ./models
#= require_tree ./views
#= require_tree ./routers
class window.BackofficeApp
Models: {}
Collections: {}
Routers: {}
Views: {}
sanity:-> true
constructor: ->
console.log "go backofficeapp!"
new BackofficeApp.Router()
try
Backbone.history.start()

路由器仍然非常简单:

class BackofficeApp.Router extends Backbone.Router
routes:
"": "index",
"users": "users",
"csense": "csense"
index: ->
console.log "index called from router!"
view = new BackofficeApp.Views.IndexView()
$('#main-app').html(view.render().el)
users: ->
console.log "users"
csense: ->
console.log "contentsense!"

还有索引视图:

class BackofficeApp.Views.IndexView extends Backbone.View    
render: ->
template = JST['index_view']
$(@el).html(template);
console.log "index called from indexview!"
this

一切都从jQuery开始(文档就绪):

jQuery ->
new BackofficeApp()

但是我们在控制台中看到以下消息/错误:

Uncaught TypeError: Cannot read property 'IndexView' of undefined
go backofficeapp!
index from router! 

如果我采取.视图从索引视图类声明中出来,它可以工作...但是,由于该应用程序是中型到大型,我们希望在命名类时使用 2(或更多)级别。

我们做错了什么?

这不会做你认为它做的事情:

class window.BackofficeApp
Models: {}
Collections: {}
Routers: {}
Views: {}

这将产生window.BackofficeAppModelsCollections,...将附加到BackofficeApp.prototype而不是BackofficeApp本身。JavaScript 版本是这样的:

window.BackofficeApp = (function() {
function BackofficeApp() {}
BackofficeApp.prototype.Models = {};
BackofficeApp.prototype.Collections = {};
BackofficeApp.prototype.Routers = {};
BackofficeApp.prototype.Views = {};
return BackofficeApp;
})();

我想你想让Models和朋友类属性:

class window.BackofficeApp
@Models: {}
@Collections: {}
@Routers: {}
@Views: {}

这将产生BackofficeApp.ModelsBackofficeApp.Collections,...这样你就可以说:

class BackofficeApp.Views.IndexView extends Backbone.View
#...

没有看到TypeErrorS。

最新更新