После обновления 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 или я использую эту модель неправильно?
Я согласен, что ожидается от позвоночника объединить полученные свойства указанного по умолчанию, но в данном случае, я меняюсь 'значения selected' к истинному _после_ мы получаем, что модель с сервера. Поэтому во второй раз, когда мы извлекаем данные с сервера, 'selected' уже определен инициализатором и изменен мной. Использование Backbone.js 0.9.10 с точно таким же кодом работает по-разному в этом jsfiddle: [http://jsfiddle.net/FH4Nj/](http://jsfiddle.net/FH4Nj/), как бы я ожидал : значения по умолчанию применяются только к отсутствующим значениям, а не только к другим. – recallfx
Многие люди утверждают, что это не так, как вы должны использовать Магистраль. Людям нравится сохранять данные на своих моделях действительно чистыми. –
Но так они показывают в примере Тодо! – recallfx