Получить / collection / id в магистрали без загрузки всей коллекции - PullRequest
7 голосов
/ 07 июня 2011

Есть ли способ загрузить один объект коллекции Backbone (с сервера)?

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

Следующий код может загрузить всю коллекцию с collection.fetch(), но как загрузить одну модель? В документации Backbone ясно сказано, что GET можно сделать /collection[/id], но не так.

Ответы [ 6 ]

9 голосов
/ 07 июня 2011

Модель должна быть объявлена ​​так:

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))}});
7 голосов
/ 06 августа 2012

Пока мы устанавливаем

url:"api/user" 

для коллекции, эквивалент для модели

urlRoot:"api/user"

это заставит магистраль автоматически добавлять / id при получении ()

4 голосов
/ 20 сентября 2011

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

1 голос
/ 20 декабря 2012

Я сделал это:

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, чтобы обойти это ограничение.

0 голосов
/ 21 июня 2011

Я сделал это:

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 и т. Д.)

0 голосов
/ 07 июня 2011

просто .fetch Модель.

Создайте модель с собственной функцией .url.

Что-то вроде

function url() {
  return "/test/product/" + this.id;
}
...