Ответ 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