Backbonejs collection.fetch() обеспечивает параметры модели по умолчанию

После обновления Backbonejs до версии 1.0 при получении коллекции с сервера применяются свойства по умолчанию, которые не отвечают.

Чтобы быть более конкретным, я создал этот тест, который можно проверить в jsfiddle.

Предположим, у нас есть определение базовой модели со свойствами по умолчанию. Свойство text можно получить с сервера в формате JSON [{ "text": "updated", "id" : 1}], а свойство selected сохраняется на стороне клиента.

var Model = Backbone.Model.extend({
    defaults: function () {
        return {
            text: 'default',
            selected: false
        };
    }    
});

Если мы используем эту настройку и получаем данные с сервера, все будет работать правильно. Теперь предположим, что мы добавляем эту модель в магистральную коллекцию следующим образом:

var Models = Backbone.Collection.extend({
    url: '/json/',
    model: Model
});

Создайте новый экземпляр коллекции и заполните его fetch:

var models = new Models();
models.fetch({
    update : true
});

После этого берем одну модель из коллекции и меняем свойство selected на true:

var model = models.get(1);
model.set('selected', true);

Теперь, если мы вызовем fetch коллекцию во второй раз, backbone очистит наше ранее измененное свойство до значения по умолчанию false, даже если такого значения в ответе не было:

models.fetch({
    update : true
});
model = models.get(1);

Получение значения selected вернет false вместо ранее установленного true.

model.get('selected');

Временное решение: закомментируйте те свойства, которые не получены от сервера.

Но в этом случае мы теряем много полезного функционала из магистрали. Является ли это регрессом в Backbonejs 1.0 или я неправильно использую эту модель?


person recallfx    schedule 10.07.2013    source источник
comment
Я согласен с тем, что от магистрали ожидается объединение полученных свойств с указанными значениями по умолчанию, но в этом случае я изменяю значение selected на true после того, как мы получим эту модель с сервера. Итак, во второй раз, когда мы получаем данные с сервера, selected уже определен инициализатором и изменен мной. Использование Backbone.js 0.9.10 с точно таким же кодом в этом jsfiddle работает иначе: http://jsfiddle.net/FH4Nj/, как я и ожидал: значения по умолчанию применяются только к отсутствующим значениям, а не только к другим.   -  person recallfx    schedule 11.07.2013
comment
Многие утверждают, что это не тот способ использования Backbone. Людям нравится сохранять данные в своих моделях действительно чистыми.   -  person Cory Danielson    schedule 12.07.2013
comment
Но это то, как они показывают на примере Todo!   -  person recallfx    schedule 23.07.2013


Ответы (1)


В Backbone.js 1.0 есть регрессия, которая исправлена ​​в текущем мастере.

Закрытая проблема

person recallfx    schedule 12.07.2013