Вызов шаблона afterRender, по-видимому, выполняется как вычисляемый Observables. Почему и как это исправить?

Итак, этот вопрос вытекает из моего предыдущего вопроса При каких условиях перерисовывает собственный шаблон Knockout

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

Это поведение похоже на computedObservables (также известное как dependentObservables), где нокаут отслеживает, от каких частей модели он зависит, а затем повторно запускает computedObservables всякий раз, когда изменяется одно из значений, от которых он зависит.

Чтобы продемонстрировать это, я написал jsFiddle: http://jsfiddle.net/unklefolk/nczCt/1/

Как и ожидалось, функция afterRender вызывается при рендеринге представления. Однако, если вы установите флажок, функция afterRender запустится снова, так как она использует viewModel.selectedPet().pet().IsHappy()

Это не имеет смысла для меня. Итак, мой вопрос:

  • Это ошибка, связанная с повторным запуском функции afterRender?
  • Как убедиться, что функция afterRender запускается только один раз?

Заранее спасибо.


person Mark Robinson    schedule 03.08.2012    source источник


Ответы (1)


Knockout использует вычисляемый наблюдаемый объект для переноса выполнения привязок к элементу. Вот как привязки снова запускаются при изменении зависимости (это ссылка может помочь в дальнейшем объяснении.

В настоящее время код afterRender не исключен из добавления к этим зависимостям. Если это нежелательно для вашего сценария, есть несколько способов предотвратить это.

person RP Niemeyer    schedule 03.08.2012
comment
Фантастический ответ. Спасибо, Райан. С нетерпением жду КО 2.2. - person Mark Robinson; 03.08.2012