在骨干中获取/收集/ id而不加载整个集合

时间:2011-06-07 08:21:16

标签: collections model backbone.js

有没有办法加载Backbone集合的单个实体(来自服务器)?

Backbone.Collection.extend({
  url: '/rest/product'
});

以下代码可以使用collection.fetch()加载整个集合,但如何加载单个模型? Backbone's documentation明确表示GET可以/collection[/id]但不能如何完成。

6 个答案:

答案 0 :(得分:9)

模型必须以这样的方式声明:

Backbone.Model.extend({
  url: function() {
    return '/rest/product/'+this.id;
  }
});

使用它很简单:

var model = new ProductModel();
model.id = productId;
model.fetch({ success: function(data) { alert(JSON.stringify(data))}});

答案 1 :(得分:7)

我们设置

url:"api/user" 

对于集合,模型的等价物是

urlRoot:"api/user"

当你获取()

时,这将使骨干自动附加/ id

答案 2 :(得分:4)

collection.fetch( {data: { id:56 } } )

答案 3 :(得分:1)

我这样做了:

Catalog.Categories.Collection = Backbone.Collection.extend({
fetchOne : function (id, success) {
    var result = this.get(id);
    if (typeof result !== 'undefined') {
        console.log(result, 'result')
        success.apply(result);
        return;
    }
    var where = {};
    where[this.model.prototype.idAttribute] = id;
    var model = new this.model(where);
    this.add(model);
    console.log(this._idAttr, where, this.model)
    model.fetch({success: function () {
        success.apply(model);
    }});
}
};

现在打电话给:

collection.fetchOne(id, function () {console.log(this)});

不再猜测模型是否已经在集合中!但是,您必须使用回叫,因为您不能依赖于恐吓结果。您可以使用async false来绕过此限制。

答案 4 :(得分:0)

只是.fetch模特。

所以用它自己的.url函数创建一个模型。

这样的东西
function url() {
  return "/test/product/" + this.id;
}

答案 5 :(得分:0)

我这样做了:

var Product = Backbone.Model.extend({});
var Products = Backbone.Collection.extend({
  model: Product,
  url: '/rest/product'
});
var products = new Products();
var first = new Product({id:1});
first.collection = products;
first.fetch();

这样做的好处是,当您不使用REST存储引擎时(相反,使用HTML5本地存储等),