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

Когда ngModel $render вызывается в AngularJS?

В этом официальном примере, что делает следующий код?

// model -> view
ctrl.$render = function() {
  elm.html(ctrl.$viewValue);
};

Насколько я могу видеть, $render никогда не вызывается.

Когда $render действительно вызывается?


UPDATE

Похоже, что $render вызывается каждый раз, когда модель изменяется. Но он не вызывается, когда модель получает свое начальное значение. Есть ли способ контролировать рендеринг исходного значения?

4b9b3361

Ответ 1

Правило $render вызывается Angular при изменении модели. В соответствии с документами $:

$Render()

Вызывается, когда представление необходимо обновить. Ожидается, что пользователь директивы ng-model будет реализовывать этот метод.

Полезно видеть, как $render вызывается в ngModelWatch (который вызывается всякий раз, когда изменяется ngModel). Здесь мы видим $formatters, затем обновляется $viewValue и, наконец, $render:

$scope.$watch(function ngModelWatch() {
    var value = ngModelGet($scope);

    // if scope model value and ngModel value are out of sync
    if (ctrl.$modelValue !== value) {

      var formatters = ctrl.$formatters,
          idx = formatters.length;

      ctrl.$modelValue = value;
      while(idx--) {
        value = formatters[idx](value);
      }

      if (ctrl.$viewValue !== value) {
        ctrl.$viewValue = value;
        ctrl.$render();
      }
    }

    return value;
  });
}];

Причина, по которой он не вызвал начальное значение, из-за этой строки в конце директивы:

// load init value from DOM
ctrl.$setViewValue(elm.html());

Это вручную обновляет значение представления без запуска ngModelWatch() и, следовательно, не проходит через $formatters или $render. Если бы это была строка:

scope.content=elm.html();

Вы увидите $render, вызванный Angular, поскольку это вызовет $watch