创建骨干模型的问题&集合

时间:2011-06-01 13:26:01

标签: javascript model-view-controller backbone.js

我真的,真的试图学习Backbone,这对我来说非常重要(来自Rails)。所以我正在尝试编写一个简单的应用程序,它只从Sinatra后端获取一个集合。现在,路由/schools返回一个看起来像["One School", "Two School"]的JSON对象。很简单。不幸的是,以下内容始终为我返回ReferenceError

学校模式

(function() {
   window.school = Backbone.Model.extend({});
}).call(this);

学校收藏

(function() {
  window.schools = Backbone.Collection.extend({
    url: '/schools',
    model: window.school
  });
}).call(this);

控制台

var f = new window.school({name: "temp"});

未定义

f.id();

ReferenceErrror

这样简单的交互不起作用。此外,调用window.schools.fetch()会导致UndefinedObject错误。不知道我到底出了什么问题,但似乎没有任何工作。任何帮助都会很棒!

编辑:该系列& model写在一个闭包中,因为它是从Coffeescript编译的。

3 个答案:

答案 0 :(得分:4)

获取模型ID的方法有两种:model.idmodel.get('id')model.id()未定义,因此会给您一个错误。请参阅http://documentcloud.github.com/backbone/#Model-id

答案 1 :(得分:1)

我从未使用过Coffeescript,但是,我在骨干方面的表现越来越好......所以我会试一试。这里可能会发生一些事情。 backbone.js依赖于jquery或zepto,以及使用'$'和'_'作为特殊变量的underscore.js。这可能会导致coffeescript出现问题。

您可能希望运行示例骨干应用程序而不是使用coffeescript进行尝试。

就上面的代码而言,我认为我发现了一些事情:

当您使用数据实例化模型时,它将没有“id”(因为它没有按照上面提到的文档与服务器同步)。如果来自服务器的数据 IS ,则在init哈希中包含id:id,而model.id将返回id。如果您需要未同步的模型的唯一标识符,则可以使用“cid”属性(这是一个本地唯一标识符)。

请记住,当你'扩展'时,你实际上是在构建一个类,所以,除非你已经实例化了一个集合的实例,否则'fetch'将不起作用。你需要这样做:

var collection = new Collection();
collection.fetch();

'save()'不起作用的原因是因为你没有为奇异模型定义一个url。你已经在集合中定义了它,但没有在模型中定义它,所以如果你试图实例化一个非集合模型,它就没有引用restful服务。

希望有所帮助!

答案 2 :(得分:0)

f没有id,因为它尚未保存到服务器。 Backbone为每个模型都有两个唯一的标识符:一个是在模型是客户端的那一刻创建的clientid。这不会发送到服务器。当模型保存到服务器时,Backbone希望它返回JSON编码的已保存模型,该模型当然具有id属性(一旦将其保存在数据库中就会获取)并更新本地模型以匹配发送的模型数据按服务器,从而在客户端模型实例上创建id属性。如果您的服务器端模型与客户端模型不完全对应,那么您可以覆盖Backbone.sync和Backbone.Model.parse函数以满足您的要求。

window.schools.fetch()失败,因为window.schools是Collection类而不是实例。在获取之前创建一个集合实例,就像创建模型实例一样,并确保rails资源学校正确配置为发送json编码的学校模型实例列表。 此外,如果您使用Backbone.sync的开箱即用实现,则必须设置: ActiveRecord :: Base.include_root_in_json = false