从服务器获取单个主干模型
Posted
技术标签:
【中文标题】从服务器获取单个主干模型【英文标题】:Fetching a single Backbone model from server 【发布时间】:2011-11-14 23:37:27 【问题描述】:假设我有一个路线设置:
'photos/:id' : 'showPhoto'
有人与朋友分享网址:www.mysite.com/photos/12345
。
当他们的朋友点击共享链接时,showPhoto
会被回调,并以 12345 作为 id 传递。我不知道如何从服务器获取模型,因为即使在设置它的 id 属性并调用 fetch() 时,主干也认为模型 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)
的解决方案吗?当我只想加载一个模型的属性时,这似乎太低效了。
【问题讨论】:
【参考方案1】:如果您没有将模型作为集合的一部分,则必须手动告诉模型完整的 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。
【讨论】:
Derick,你是怎么来这么多了解 Backbone 的?我还没有找到任何权威的指南。我阅读了 Addy Osmani 的基本原理和 Backbone 食谱,以及包括你在内的无数博客。你似乎比大多数人有更深刻的理解。你在哪里捡到的? 反复试验,阅读 Backbone 源代码,阅读我能阅读的所有内容,尽可能多地学习 javascript……但主要是尝试教其他人。教别人会迫使你深入挖掘并真正了解正在发生的事情。 :) 这似乎是一个过时的答案,因为 Backbone 的 API 已经改进。我们可以改进此响应吗?【参考方案2】:您不需要告诉主干是否将 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】:已经有一个类似的问题:“How do I fetch a single model in Backbone?”
我的答案应该对你有用(并且在咖啡脚本中)
还记得查Backbone Model#url documentation,那里都有说明
【讨论】:
【参考方案4】:我会引导集合(通过将以下内容呈现到页面),其中只有一个模型,如下所示:
photos = new PhotoCollection();
photos.reset([ @html.ToJson(Model) ]);
请注意,我使用的服务器端代码是 ASP.Net MVC,因此请使用特定于您的服务器端架构的代码。另请注意,方括号很重要,因为它们将您的奇异模型包装在一个数组中。
希望对您有所帮助。
【讨论】:
以上是关于从服务器获取单个主干模型的主要内容,如果未能解决你的问题,请参考以下文章
将单个 Jenkins 发布作业配置为使用 Perforce 作为 SCM 从主干或分支发布