我是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.BackofficeApp
但Models
,Collections
,...将附加到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.Models
,BackofficeApp.Collections
,...这样你就可以说:
class BackofficeApp.Views.IndexView extends Backbone.View
#...
没有看到TypeError
S。