2011-06-01 42 views
0

我真的,真的试图学习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错误。不知道我哪里错了,但似乎没有任何工作。任何帮助都是极好的!

编辑:集合&模型写在闭包,因为它从Coffeescript编译。

回答

4

有两种获取模型ID的方法:model.idmodel.get('id')model.id()未定义,所以它会给你一个错误。见http://documentcloud.github.com/backbone/#Model-id

+0

无论这些工作。 'new window.school.save()'也没有。如不行我的意思是我得到同样的ReferenceError [这里是一个图像(http://i.imgur.com/xlVxD.png) – Jason 2011-06-01 14:06:51

+0

看看[链接](http://pastebin.com/3G4yhCMv) ,这是Chrome在Javascript控制台中显示的内容。你的浏览器如何回应? – jp10k 2011-06-01 15:21:19

1

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

您可能想要运行一个示例骨干应用程序,而不是使用coffeescript进行尝试。

至于上面的代码中,有一对夫妇的事情,我想我已经发现:

当你实例化的数据模型,它将没有“身份证”(因为它没有被同步到服务器按照上面提到的文档)。如果服务器的数据为IS,那么在init散列中包含一个id:id,并且model.id将返回一个id。如果您需要尚未同步的模型的唯一标识符,则可以使用“cid”属性(这是一个本地唯一标识符)。记住,当你'扩展'时,你实际上正在构建一个类,所以,除非你已经实例化了一个集合的实例,否则'fetch'将不起作用。您需要这样做:

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

'save()'不工作的原因是您没有为单数模型定义网址。你已经在集合中定义了它,但不是模型,所以如果你尝试实例化一个非集合模型,它就没有引用restful服务。

希望有帮助!因为它没有被保存到服务器

0

F没有有一个id。骨干对每个模型都有两个唯一的标识符:一个是在模型是客户端时创建的clientid。这不会发送到服务器。当一个模型保存到服务器,骨干期望它返回JSON编码保存的模型,这当然有一个id属性(它aquires一旦它被保存在数据库中)和更新局部模型匹配发送的模型数据通过服务器,从而在客户端模型实例上创建id属性。如果您的服务器端模型确实与客户端模型不完全对应,那么您可以覆盖Backbone.sync和Backbone.Model.parse函数以满足您的要求。因为window.schools是一个集合类,而不是一个实例

window.schools.fetch()失败。创建一个集合实例,就像在创建模型实例之前创建模型实例一样,并确保rails资源学校被正确配置为发送json编码的学校模型实例列表。 此外,如果您正在使用外的开箱实施Backbone.sync的打算,你将不得不设置: 的ActiveRecord :: Base.include_root_in_json =假