2013-07-10 3 views
1

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

Чтобы уточнить, что я создал этот тест, который может быть проверен в 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 недвижимость истина:

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

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

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

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

model.get('selected'); 

Обход: закомментируйте те свойства, которые не получили от сервера.

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

+0

Я согласен, что ожидается от позвоночника объединить полученные свойства указанного по умолчанию, но в данном случае, я меняюсь 'значения selected' к истинному _после_ мы получаем, что модель с сервера. Поэтому во второй раз, когда мы извлекаем данные с сервера, 'selected' уже определен инициализатором и изменен мной. Использование Backbone.js 0.9.10 с точно таким же кодом работает по-разному в этом jsfiddle: [http://jsfiddle.net/FH4Nj/](http://jsfiddle.net/FH4Nj/), как бы я ожидал : значения по умолчанию применяются только к отсутствующим значениям, а не только к другим. – recallfx

+0

Многие люди утверждают, что это не так, как вы должны использовать Магистраль. Людям нравится сохранять данные на своих моделях действительно чистыми. –

+0

Но так они показывают в примере Тодо! – recallfx

ответ

1

Существует регрессия в Backbone.js 1.0, которая фиксируется в текущем ведущем устройстве.

Closed issue