如何设置Collection的网址

时间:2011-06-07 09:54:34

标签: backbone.js

让我说我有:

var Book = Backbone.Model.extend();

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

如何在实例化新集合时更改Collection的{​​{1}}?

url不起作用

var AdventureBooks = new Books({ url: '/books/adventure' })

并在Collection定义中:

var AdventureBooks = new Books({ category: 'adventure' }) 也不起作用。

感谢。

8 个答案:

答案 0 :(得分:39)

以下内容应该有效:

var AdventureBooks = new Books();
AdventureBooks.url = '/books/adventure';

答案 1 :(得分:28)

var Book = Backbone.Model.extend({
  "url": function() {
    return '/books/' + this.get("category");
  }
});

答案 2 :(得分:13)

由于某种原因,传递给Collection构造函数的参数(例如“url”)未设置为该对象。该集合仅使用其中的少数(模型和比较器)。

如果你想通过构造函数传递url,你需要创建初始化方法,将必要的参数复制到对象:

var Book = Backbone.Model.extend({
    initialize: function(props) { 
        this.url = props.url;
    }
}
var book = new Book({url: "/books/all"});

答案 3 :(得分:9)

像Daniel Patz pointed out 一样,问题在于你如何实例化集合。我现在只是努力解决这个问题,所以我想我会更新这个,即使问题有些陈旧。

第一个参数应该是一个模型数组,后面会有选项。这应该有效:

var AdventureBooks = new Books([], { url: '/books/adventure' })

如果你想要一个动态网址,那么Raynos的回答可能就是你要做的。

答案 4 :(得分:3)

如果您想为您的收藏品设置动态网址,请尝试使用此网址(使用主干网1.1.2进行测试):

创建骨干集合的实例并将动态url参数作为选项传递(options对象需要是第二个参数,因为第一个参数是可选的模型数组):

var tweetsCollection = new TweetsCollection(null, { userId: 'u123' });

然后在集合内部创建一个动态url函数,该函数使用options对象中的值:

var TweetsCollection = Backbone.Collection.extend({
    url: function() {
        return '/api/tweets/' + this.options.userId;
    },
    model: TweetModel
});

答案 5 :(得分:2)

对我来说最好的解决方案是初始化方法,请看这个例子:

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

答案 6 :(得分:1)

我知道这是一个迟到的回复,但我有一个类似但稍微复杂的情况,所选择的答案并没有真正帮助我。

我有一个条件集合,每个实验模型都有多个条件,我需要我的网址为/ api / experiments /:experimentId / conditions,但我不知道如何从空访问experimentId条件收集。

在我的条件集合url函数中,我做了一个console.log(this.toJSON())并发现了 Backbone在空集合中插入一个虚拟模型,其中包含您在创建时传递的任何属性。

这样:

var Conditions = new ConditionsCollection({
  experimentId: 1
});

我怀疑这会被认为是最佳做法,希望其他人会回答更好的解决方案,但这就是我如何定义我的收藏:

var ConditionsCollection = Backbone.Collection.extend({
  model: Condition,
  url:  function(){
    var experimentId = this.at(0).get("experimentId");
    return "/api/experiments/" + experimentId + "/conditions";
  }
});

答案 7 :(得分:0)

这项工作对我来说(用主干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'});