说我有路线设置:
'photos/:id' : 'showPhoto'
并且有人与朋友分享网址:www.mysite.com/photos/12345
。
当他们的朋友点击共享链接时,showPhoto
会被回拨,并以12345作为ID传递。我无法弄清楚如何从服务器获取模型,因为即使设置其id属性并调用fetch(),backbone也会认为模型isNew
因此ajax请求URL只是/photos
而是/photos/12345
:
showPhoto: (id) ->
photo = new models.Photo _id:id
photo.fetch #does a GET to /photos, I would have expected it to request /photos/12345
success: () ->
render photo view etc...
Photo = Backbone.Model.extend
idAttribute: '_id'
urlRoot: '/photos'
模型Photo
通常是集合的一部分,但在这种情况下,有人正在直接访问该网站,并且只希望查看一张照片的数据,因此该集合不会在此应用状态下实例化。
解决方案是加载整个照片集然后使用collection.getById(id)
吗?当我只想加载一个模型的属性时,这似乎效率太低。
答案 0 :(得分:25)
如果您没有将模型作为集合的一部分,则必须手动告诉模型完整的URL。它不会自动将id附加到您指定的urlRoot。您可以指定一个函数作为urlRoot来执行此操作:
Photo = Backbone.Model.extend({
urlRoot: function(){
if (this.isNew()){
return "/photos";
} else {
return "/photos/" + this.id;
}
}
});
Backbone使用模型的id
来确定它是否是新的,所以一旦你设置了它,这段代码就可以正常工作了。如果没有,你总是可以在if语句中检查id,而不是检查isNew。
答案 1 :(得分:3)
您无需告知骨干是否将ID附加到网址。根据文档:http://backbonejs.org/#Model-fetch,您只需将urlRoot设置为集合中url的等效值即可。
如果您使用以下方法之一,Backbone将自动将所需的ID附加到网址:
model.set("id", 5); //After initialized
model = new Backbone.Model({id: 5}); //New model
如果您在属性哈希中或直接在模型上手动设置id,骨干网将不会意识到它。
model.id = 5; //Don't do this!
答案 2 :(得分:2)
已经有类似的问题:“How do I fetch a single model in Backbone?”
我的回答应该适合你(并且它在coffeescript中)
还记得检查Backbone Model#url documentation,这里都解释了
答案 3 :(得分:1)
我会用这样的一个模型来引导集合(通过渲染以下内容到页面中):
photos = new PhotoCollection();
photos.reset([ @Html.ToJson(Model) ]);
请注意,我使用的服务器端代码是ASP.Net MVC,因此请使用特定于服务器端体系结构的内容。另请注意,方括号很重要,因为它们采用您的单个模型并将其包装在一个数组中。
希望这有帮助。