После обновления 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 или я неправильно использую эту модель?
selected
на true после того, как мы получим эту модель с сервера. Итак, во второй раз, когда мы получаем данные с сервера,selected
уже определен инициализатором и изменен мной. Использование Backbone.js 0.9.10 с точно таким же кодом в этом jsfiddle работает иначе: http://jsfiddle.net/FH4Nj/, как я и ожидал: значения по умолчанию применяются только к отсутствующим значениям, а не только к другим. - person recallfx   schedule 11.07.2013