обновлять только определенные атрибуты модели, используя Backbone.js - PullRequest
3 голосов
/ 15 марта 2011

С помощью Backbone я пытаюсь обновить и сохранить на сервере только один атрибут:

currentUser.save({hide_explorer_tutorial: 'true'});

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

В настоящее время я использую unset (attribute_name), чтобы удалить все атрибуты, которые я не хочу обновлять на сервере. Проблема в том, что эти атрибуты больше не доступны для локального использования.

Рекомендации по сохранению только определенных атрибутов на сервере?

Ответы [ 5 ]

20 голосов
/ 13 февраля 2013

Начиная с магистрали 0.9.9

Просто передайте {patch:true} в функцию save, например:

currentUser.save({hide_explorer_tutorial: 'true'}, {patch:true});

Из документации ,

Если вместо этого вы хотите, чтобы только измененные атрибуты отправлялись на сервер, вызовите model.save (attrs, {patch: true}).Вы получите запрос HTTP PATCH на сервер только с переданными атрибутами.

7 голосов
/ 15 марта 2011

Для этого можно использовать toJSON в модели.

toJSON : function(){
  return {hide_explorer_tutorial: this.get("hide_explorer_tutorial")};
}

Это будет единственный атрибут, отправляемый бэкэнду при сохранении.

4 голосов
/ 04 августа 2014

На самом деле есть гораздо более простой способ достичь этого

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

// 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 ([атрибуты], [параметры])

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

Пример

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

Для вашего конкретного случая

var data = { id : currentUser.id ,  hide_explorer_tutorial: 'true' }  ;  
currentUser.save( {}, { data : JSON.stringify(data) } );

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

Спасибо за голосование

1 голос
/ 15 марта 2011

Я полагаю, что в настоящее время это невозможно: Частичное обновление модели Backbone.js

0 голосов
/ 21 мая 2019

Есть хитрость, если вы не устанавливаете свойство data, а свойство attrs для аргумента options, полезная нагрузка запроса будет значением свойства attrs вместо всех атрибутов модели.

Примечание. Это также работает для действий по созданию модели (POST).

Для вашего конкретного случая:

var data = { hide_explorer_tutorial: 'true' };  
currentUser.save(data, { attrs : data });

Более подробную информацию можно найти в файле backbone.js 1.33 исходный код (строка 1405 - 1409):

// 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));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...