Backbone.js: как обработать разницу между моделью и ответом сервера - PullRequest
1 голос
/ 11 января 2012

Я пишу приложение Backbone, в котором у меня нет контроля над сущностями, возвращаемыми сервером.

Оказывается, мне удобно иметь внутреннее представление данных, которое немного отличается от JSON, используемого сервером. В одном направлении все просто: я могу написать метод Model.parse(), который принимает в качестве входных данных JSON, возвращаемый сервером, и возвращает атрибуты моего объекта.

Я не совсем уверен, что делать в другом направлении. Я не смог найти метод, который вызывается, когда мой объект сериализуется для сохранения. Существует Model.toJSON(), но, похоже, он не используется до сохранения модели.

Как мне справиться с этой разницей?

1 Ответ

2 голосов
/ 11 января 2012

Сначала - аннотированный источник - лучшее место, где можно найти ответы на вопросы о Backbone.

Глядя на источник для Backbone.sync, вы можете увидеть, что модель сериализована с использованием JSON.stringify(model.toJSON()) (предполагается, что вы не используете emulateJSON), поэтому переопределение этого метода должно достичь того, что вам нужно. Я не могу объяснить, почему это не работает для вас без сокращенного теста.

Более длинный ответ заключается в том, что для полного контроля над синхронизацией сервер-клиент вы должны написать собственную реализацию Backbone.sync. Метод довольно прост (см. Аннотированный источник), и вы можете просто обернуть исходную синхронизацию, если вы просто хотите внести простые изменения.

Например:

function mySyncFunction(method, model, options){
  if(method == 'create' || method == 'update'){
    options.contentType = 'application/json';
    options.data = model.serializeForServer(); //You will need to write this method
  }
  return Backbone.sync(method, model, options);
}

Чтобы использовать пользовательский метод синхронизации, просто объявите его как часть вашей модели

var myModel = Backbone.Model.extend({ 
  ...

  "sync": mySyncFunction,

  ...
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...