[javascript] Исключить свойства модели при синхронизации (Backbone.js)



4 Answers

В Underscore 1.3.3 они добавили pick и в 1.4.0 они добавили omit который можно использовать очень просто, чтобы переопределить функцию toJSON вашей модели, чтобы атрибуты whitelist с атрибутами _.pick или blacklist с _.omit .

И поскольку toJSON используется командой sync для передачи данных на сервер, я думаю, что это хорошее решение, если вы не хотите использовать эти поля везде, где бы вы ни использовали toJSON .

Backbone.Model.extend({
    blacklist: ['selected',],
    toJSON: function(options) {
        return _.omit(this.attributes, this.blacklist);
    },
});
Question

Есть ли способ исключить определенное свойство из моей модели при синхронизации?

Например, я сохраняю в своей модели информацию о каком-либо состоянии представления. Предположим, у меня есть модуль выбора, и этот модуль просто переключает selected атрибуты на мою модель. Позже, когда я вызываю .save() в своей коллекции, я бы хотел проигнорировать значение selected и исключить его из синхронизации на сервер.

Есть ли чистый способ сделать это?

( Дайте мне знать, если вы хотите получить более подробную информацию )




Я нашел некоторые проблемы с принятым решением, так как options.data изменяет способ вызова Backbone. Лучше использовать options.attrs следующим образом:

Backbone.Model.extend({
    save: function (attrs, options) {
        options = options || {};
        attrs = _.extend({}, _.clone(this.attributes), attrs);

        // Filter the data to send to the server
        delete attrs.selected;
        options.attrs = attrs;
        // Proxy the call to the original save function
        return Backbone.Model.prototype.save.call(this, attrs, options);
    }
});



Чтобы установить только нужные значения, используйте HTTP PATCH insead HTTP POST. На стороне основы просто добавьте атрибут patch к методу сохранения:

entity.save(data,{patch:true})

Используя save с этим атрибутом, на сервер отправляются только те поля, которые передаются как data .




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

если вы посмотрите на строку backbone.js 1145, вы увидите, что

// Ensure that we have the appropriate request data.
    if (options.data == null && model && (method === 'create' || method === 'update' || method === 'patch')) {
      params.contentType = 'application/json';
      params.data = JSON.stringify(options.attrs || model.toJSON(options));
    }

Это означает, что вы можете переопределить часть данных xhr путем помещения данных в ваши параметры

Поскольку для поддержки магистральной системы требуется model.save ([attributes], [options])

Но помните, что атрибуты, такие как id, могут быть необходимы для правильной экономии

пример

model.save( {}, { data: JSON.stringify(data) } ) ; 

Поэтому вы должны делать что-то подобное

var data = { id : model.id , otherAttributes : 'value' }  ;  
model.save( {}, { data : JSON.stringify(data) } );

Это делает трюк довольно хорошо для меня и может использоваться с любой основой с xhr, такой как выборка, сохранение, удаление, ...




Поскольку save использует toJSON мы переопределяем его:

    toJSON: function(options) {
        var attr = _.clone(this.attributes);
        delete attr.selected;
        return attr;
    },

Но это может не сработать, если вы используете toJSON и, например, должны быть selected в виде. В противном случае вам, вероятно, придется переопределить метод save .




Related