如何在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" } });