我真的,真的试图学习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编译的。
答案 0 :(得分:4)
获取模型ID的方法有两种:model.id
和model.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