从服务器获取单个Backbone模型

时间:2011-09-12 00:21:06

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

说我有路线设置:

'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)吗?当我只想加载一个模型的属性时,这似乎效率太低。

4 个答案:

答案 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,因此请使用特定于服务器端体系结构的内容。另请注意,方括号很重要,因为它们采用您的单个模型并将其包装在一个数组中。

希望这有帮助。