如何设置一个集合的url
假设我有:
var Book = Backbone.Model.extend(); var Collection = Backbone.Collection.extend({ model: Book, url: '/books', initialize: function(){ this.fetch(); }) })
实例化新集合时,如何更改Collection
的url
?
var AdventureBooks = new Books({ url: '/books/adventure' })
不起作用
var AdventureBooks = new Books({ category: 'adventure' })
并在集合定义中:
url : '/books/' + this.category
也不起作用。
谢谢。
var Book = Backbone.Model.extend({ "url": function() { return '/books/' + this.get("category"); } });
以下应该工作:
var AdventureBooks = new Books(); AdventureBooks.url = '/books/adventure';
由于某些原因,传递给Collection构造函数的参数(例如“url”)不会被设置为该对象。 该集合只使用其中的几个(模型和比较器)。
如果要通过构造函数传递url,则需要创build初始化方法,以将必要的参数复制到对象中:
var Book = Backbone.Model.extend({ initialize: function(props) { this.url = props.url; } } var book = new Book({url: "/books/all"});
就像Daniel Patz 指出的那样 ,问题在于你如何实例化集合。 我现在只是为此苦苦挣扎,所以我想我会更新这个,即使这个问题有些老旧。
第一个参数预计将是一个模型arrays,选项在后面。 这应该工作:
var AdventureBooks = new Books([], { url: '/books/adventure' })
如果你想要一个dynamic的URL,那么Raynos的答案可能就是要走的路。
如果你想为你的collectionsdynamicURL,试试这个(testing骨干1.1.2):
创build一个骨干集合的实例,并将dynamicurl参数作为选项传递(选项对象需要作为第二个参数,因为第一个参数是可选的模型数组):
var tweetsCollection = new TweetsCollection(null, { userId: 'u123' });
然后在你的集合里面,创build一个使用options对象中的值的dynamicurl函数:
var TweetsCollection = Backbone.Collection.extend({ url: function() { return '/api/tweets/' + this.options.userId; }, model: TweetModel });
对我来说最好的解决方法是初始化方法,看看这个例子:
Entities.MyCollection = Backbone.Collection.extend({ model: Entities.MyModel, initialize: function(models,options) { this.url = (options||{}).url || "defaultURL"; }, }
使用它如下:
var items = new Entities.MyCollection(); //default URL var items = new Entities.MyCollection([],{url:'newURL'}); //changed URL
我知道这是一个迟到的答复,但是我有一个类似的,虽然稍微复杂一些的情况,而选定的答案并没有真正帮助我。
我有一个条件集合,每个实验模型有多个条件,我需要我的url是/ api / experiments /:experimentId / conditions,但我不知道如何从空的Conditions集合访问experimentId。
在我的Conditions集合url函数中,我做了一个console.log(this.toJSON()),发现Backbone在空集合中插入一个虚拟模型,并使用在创build时传入的属性。
所以:
var Conditions = new ConditionsCollection({ experimentId: 1 });
我怀疑这将被认为是一个最佳做法,希望别人会回应一个更好的解决scheme,但这是我如何定义我的collections:
var ConditionsCollection = Backbone.Collection.extend({ model: Condition, url: function(){ var experimentId = this.at(0).get("experimentId"); return "/api/experiments/" + experimentId + "/conditions"; } });
这项工作对我来说(testing骨干1.2.1):
var serverData = Backbone.Collection.extend({ url: function() { return '//localhost/rest/' + this.dbname; }, constructor: function(a) { if(a.dbname){ this.dbname = a.dbname; } Backbone.Collection.apply(this, arguments); } });
使用它如下:
var users = new serverData({dbname : 'users'});