Лучший способ расширения модели

Согласно документации Backbone.js Model-parse выполняет следующие действия:

parse вызывается всякий раз, когда данные модели возвращаются сервером при выборке и сохранении.

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

Пример:

объект выборки {age: 19}
после того, как анализатор будет {age: 19, isAdult: true}

Когда я выполняю запрос на сохранение, в запросе PUT у меня также есть другие параметры, которые не нужны (например, isAdult). Я хотел бы иметь оригинальную модель (без дополнительных параметров в запросе PUT).

Как лучше всего достичь моей цели в Backbone?


person antonjs    schedule 17.05.2012    source источник
comment
@AntoJs - твой вопрос был не очень ясен. Я попытался скрыть идею, я думаю, которую вы пытались донести. Убедитесь, что мое редактирование соответствует вашей проблеме.   -  person EBarr    schedule 18.05.2012
comment
@EBarr, ты понял суть моего вопроса. благодаря.   -  person antonjs    schedule 18.05.2012


Ответы (1)


Если я правильно понял ваш вопрос....

Когда магистраль взаимодействует с сервером, используя сохранение, она отправляет полное представление модели. Как говорится в документах:

Хэш атрибутов (как в наборе) должен содержать атрибуты, которые вы хотите изменить — ключи, которые не упомянуты, не будут изменены — но на сервер будет отправлено полное представление ресурса.

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

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

Я бы использовал реализацию синхронизации по умолчанию в качестве отправной точки.

person EBarr    schedule 17.05.2012
comment
sync в конечном итоге выполняет model.toJSON(), чтобы получить data для вызова $.ajax, чтобы вы могли взломать sync на модели, которая использует только часть нормального значения toJSON. Я все еще думаю, что исправление кода сервера для внесения в белый список всех входящих данных имеет смысл, но замена sync также имела бы смысл, если бы isAdult было большой кучей дополнительных вещей, а не просто логическим флагом. - person mu is too short; 18.05.2012
comment
@muistooshort - я согласен с белым списком. Исходя из точки зрения .net MVC/WebAPI, он запечен в торте с помощью связывателя модели. Хотя я также понимаю инстинкт удаления посторонних данных из вызовов, особенно если вызовы являются высокочастотными (более короткие строки для анализа на стороне сервера), или вы можете предотвратить передачу многих K данных по сети (много ненужного текста? мобильный, где несколько K могут иметь большое значение?). - person EBarr; 18.05.2012
comment
К слову, я с вами не спорю. И да, байты в мобильном мире довольно быстро накапливаются. На самом деле я думаю, что Backbone должен иметь метод unparse или serialize, который sync мог бы использовать вместо toJSON, по умолчанию будет просто return _.clone(this.attributes), как это делает toJSON, но для этого конкретного случая использования был бы удобен отдельный метод, который предлагал бы хорошую симметрию с существующим parse. Может быть, я должен сделать запрос на вытягивание. - person mu is too short; 18.05.2012
comment
Это звучит как работающее решение для меня. Я знаю, что я бы использовал его. - person EBarr; 18.05.2012