如何在Backbone中获取单个模型?

我在Backbone有一个Clock模型:

 var Clock = Backbone.Model.extend({}); 

我试图从/clocks/123获取最新信息的实例。 有些事我已经尝试了:

一个“类”级的方法

 Clock.fetch(123) // TypeError: Object function (){ ... } has no method 'fetch' 

创build一个实例,然后调用它的fetch

 c = new Clock({id: 123}) c.fetch() // Error: A 'url' property or function must be specified 

一个集合

我试图创build一个AllClocks集合资源(即使我没有使用这样的事情在页面上):

 var AllClocks = Backbone.Collection.extend({ model: Clock, url: '/clocks/' }); var allClocks = new AllClocks(); allClocks.fetch(123); // returns everything from /clocks/ 

我如何获得一个 API支持的时钟?

你的第二个方法是我使用的方法。 尝试添加以下到您的时钟模型:

 url : function() { var base = 'clocks'; if (this.isNew()) return base; return base + (base.charAt(base.length - 1) == '/' ? '' : '/') + this.id; }, 

这种方法假设你已经在你的URL中使用hashbang实现了控制器,就像http://www.mydomain.com/#clocks/123一样; ,但即使你还没有,它也应该可以工作。

尝试在模型中指定urlRoot :

从文档:

 var Book = Backbone.Model.extend({urlRoot : '/books'}); var solaris = new Book({id: "1083-lem-solaris"}); solaris.fetch(); 

我个人build议遵循Model#url方法文档

 model = new Model(id: 1) view = new View(model: model) collection = new Collection([model]) model.fetch() 

在你的collections记得添加collectionsurl:

 url: "/models" 

并在你的视图的初始化函数做:

 this.model.bind("change", this.render) 

这样骨干网就会使用这个url做一个ajax请求:

 "/models/1" 

您的模型将被更新并且呈现视图,而无需修改Collection#url或Model#urlRoot

注意:对不起,这个例子在咖啡脚本中出现,但是你可以很容易地把它翻译成js,添加var语句

 var Person = Backbone.Model.extend({urlRoot : '/person/details'}); var myName = new Person({id: "12345"}); myName.fetch(); 

因此你在这个方法上做了一个Ajax请求

 URL http://[domainName]/person/details/id 

你有JSON回应。

Enjoiiii !!!

…并且如果你不想在模型urlRoot上使用尾部的斜杠,

  url : function() { return this.urlRoot + this.id; }, 

您可能应该通过一个集合访问对象,并始终将其保存在集合中。 这是如何做到这一点:

 var AllClocks = Backbone.Collection.extend({ model: Clock, url: '/clocks/' }); var allClocks = new AllClocks(); my_clock = allClocks.add({id: 123}); my_clock.fetch() 

我想使用RESTfulurl,但我不明白为什么'postId'不能被添加到基地url。

 var PostModel = Backbone.Model.extend({ urlRoot: 'getBlogPost', defaults: { postTitle: "defaultTitle", postTime: "1970-01-01", postContent: "defaultContent", postAuthor: "anonymous" } }); var post = new PostModel({ postId: 1 }); alert(post.url()); 

然后我知道只有在模型中设置'idAttribute'为'postId'后,我可以得到正确的url。 喜欢这个:

 var PostModel = Backbone.Model.extend({ idAttribute: 'postId', urlRoot: 'getBlogPost', defaults: { postTitle: "defaultTitle", postTime: "1970-01-01", postContent: "defaultContent", postAuthor: "anonymous" } });