首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从服务器获取单个主干模型

从服务器获取单个主干模型
EN

Stack Overflow用户
提问于 2011-09-12 08:21:06
回答 4查看 26.2K关注 0票数 17

假设我有一个路由设置:

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 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。

票数 25
EN

Stack Overflow用户

发布于 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!
票数 3
EN

Stack Overflow用户

发布于 2011-09-17 19:46:30

已经有一个类似的问题:"How do I fetch a single model in Backbone?

我的答案应该适用于你(它是用coffeescript编写的)

还要记得查看Backbone Model#url documentation,这里有详细的解释

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7382243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档