如何设置一个集合的url

假设我有:

var Book = Backbone.Model.extend(); var Collection = Backbone.Collection.extend({ model: Book, url: '/books', initialize: function(){ this.fetch(); }) }) 

实例化新集合时,如何更改Collectionurl

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'});