0

我正在关注这本书,Backbone.js on Rails,并在阅读它的同时创建了基本的 todo 应用程序,但我在尝试初始化应用程序命名空间内的集合时遇到以下 javascript 错误:

错误:TodoApp.Collections.Notes 不是构造函数源文件:localhost:3000/assets/todo_app.js?body=1 行:13

todo_app.js

var TodoApp = {
  Models: {},
  Collections: {},
  Views: {},
  Routers: {},
  initialize: function(data) {
    console.log("INITIALIZE");
    var notes = new TodoApp.Collections.Notes(data.notes); 
    new TodoApp.Routers.Notes({ notes: notes }); 
    Backbone.history.start();    
  }
};

到目前为止,我已经按照说明创建了一个 Note 模型、Notes 集合和路由器,这就是在 index.html.erb 上调用 initialize 方法的方式:

<%= javascript_tag do %>
  TodoApp.initialize({ notes: <%== @notes.to_json %> });
<% end %>

这是我包含所有文件的顺序:

//= require jquery
//= require jquery_ujs
//= require underscore
//= require json2
//= require backbone
//= require backbone-support
//
//= require todo_app
//
//= require_tree ./models 
//= require_tree ./collections 
//= require_tree ./views 
//= require_tree ./routers 
//= require_tree ../templates
//= require_tree .

有人能帮忙吗?我在这里错过了什么?谢谢

4

4 回答 4

0

您可以尝试实例化新集合,然后使用该reset方法填充它。

在您的示例中,它应该是这样的:

initialize: function(data){
  var notes = new TodoApp.Collections.Notes()
  notes.reset(data.notes) 

}

“reset”方法接受模型列表或哈希。有关更多信息,请参阅主干文档

使用此方法的另一个好方法是在网页上预加载信息,然后让我们的集合填充存储的数据。您可以使用这样的数据标签在 div 上插入:

<%= content_tag "div", "Can be blank", id: "container-id", data: { notes: Notes.all } %>

然后调用:

notes.reset($('#container-id').data 'notes')

如果您想获得更多信息,可以查看Backbone 上的 Ryan Bates Screencasts 。请注意,要观看这些视频,您必须订阅他的网站。

PS:如果你的 todo_app.js 的位置在你的 javascript 资产文件夹中,你不必使用资产管道添加它,因为它会被 rails 自动拾取//= require_tree .

于 2013-02-26T02:07:01.490 回答
0

Javascript 按加载顺序进行评估,因此我猜您的应用程序正在尝试在加载包含集合的文件之前进行初始化(您在其他文件之前包含 todo_app)。

最后包含 todo_app 或监听文档 onload 事件并在页面完全加载后初始化应用程序。

于 2012-10-19T09:56:25.377 回答
0

TodoApp.initialize({ notes: <%== @notes.to_json %> });似乎是一个错字。应该是TodoApp.initialize({ notes: <%= @notes.to_json %> });

于 2012-10-19T09:55:21.603 回答
0

尝试使用:

TodoApp.initialize({ notes: <%= @notes.to_json.html_safe -%> });
于 2013-02-25T21:26:49.267 回答