假设我有一个路由设置:
'photos/:id' : 'showPhoto'
并且有人与朋友共享url: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)
吗?当我只想加载一个模型的属性时,这似乎太低效了。
发布于 2011-09-12 11:05:29
如果你没有模型作为集合的一部分,你必须手动告诉模型完整的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。
发布于 2015-01-26 04:46:06
您不需要告诉backbone是否将id附加到url。根据文档:http://backbonejs.org/#Model-fetch,您可以简单地将urlRoot设置为集合中的url等效项。
如果您使用以下方法之一,Backbone会自动将所需的id附加到url:
model.set("id", 5); //After initialized
model = new Backbone.Model({id: 5}); //New model
如果您在属性散列中手动设置id或直接在模型上设置id,backbone将不会意识到这一点。
model.id = 5; //Don't do this!
发布于 2011-09-17 19:46:30
已经有一个类似的问题:"How do I fetch a single model in Backbone?“
我的答案应该适用于你(它是用coffeescript编写的)
还要记得查看Backbone Model#url documentation,这里有详细的解释
https://stackoverflow.com/questions/7382243
复制相似问题