Подтвердить что ты не робот

В Backbone.js, почему молчащие изменения инициируют события изменения в конечном итоге?

Когда я передаю {"silent":true} при установке атрибута в модели Backbone, почему это не просто подавляет событие change:attribute? В чем преимущество активации этого события при следующем изменении атрибута?

Обновление

Магистраль 0.9.10 изменила поведение прохождения { "silent": true }. Из журнала изменений:

Передача {silent:true} при изменении больше не будет задерживать отдельных "change: attr", вместо этого они полностью отключены.

Просмотрите журнал изменений здесь

4b9b3361

Ответ 1

Это смутило меня и в течение некоторого времени.

Причина в том, что {silent: true} означает не означает "делать все как обычно, но просто не запускать событие".

Из различных комментариев и ответов от @jashkenas, это означает, что "просто измените значение атрибута (и добавьте его в хэш-код" changedAttributes "), но отложите все другие действия, связанные с изменением, до тех пор, пока они не будут".

"silent" не предотвращает событие change для этих/этих свойств, он просто приостанавливает "объявление" до тех пор, пока не будет запущено следующее событие change.

Итак, его, вероятно, лучше назвали что-то вроде defer.

Релевантная информация:

https://github.com/documentcloud/backbone/pull/850

точка "молчаливого" изменения заключается в том, что она не считается изменением с точки зрения моделей. Позже, когда изменение действительно происходит, вы получаете полную разницу все сразу.

https://github.com/documentcloud/backbone/issues/870

Потому что момент молчащих изменений заключается в том, что вы можете временно изменить внутреннее состояние вашей модели, не внося никаких изменений. Позже, когда атрибут действительно изменяется, запускаются проверки и события. Было бы бессмысленно испускать событие ошибки при молчаливом изменении.

Обновление 4/7/2013

Примечание. Я не тестировал это, чтобы подтвердить поведение, это просто основано на моем чтении примечаний к выпуску...

В соответствии с базой 0.9.10 описанное выше поведение изменилось. В этой версии (и новее), silent:true полностью подавляет события change:attr - не просто задерживает их.

http://backbonejs.org/#changelog

Ответ 2

В базовой области 0.9.2 функция set запускает проверку до того, как будут изменены какие-либо изменения.

  // Run validation.
  if (!this._validate(attrs, options)) return false;

Если опция {silent: true} передана, код проверки не будет выполнен.

  if (options.silent || !this.validate) return true;

Это означает, что model.set({value: 100}, {silent: true}); может установить "недопустимое" значение в модель, поэтому атрибуты обновляются, но событие изменения не срабатывает.

Это полезно, тогда вы хотите обновить некоторое поле и предотвратить проверку всего режима, поэтому, если модель еще не завершена, изменение все равно распространяется на атрибуты. Но обычно вы также хотите, чтобы представление отображало изменение, поэтому вам нужно вручную вызвать model.change() или model.trigger('change:value', model, value).