In this official example,以下代码在做什么?
// model -> view
ctrl.$render = function() {
elm.html(ctrl.$viewValue);
};
As far as I can see,永远不会调用$render
。
实际调用$render
时?
更新
每次模型更改时都会调用$render
。但是,当模型获得其初始值时,不会调用它。有没有办法控制初始值的渲染?
答案 0 :(得分:29)
当模型发生变化时,Angular会调用右$render
。根据{{3}}:
$渲染()
需要更新视图时调用。预计用户 ng-model指令将实现此方法。
了解$render
中ngModelWatch
的调用方式很有帮助(ngModel
更改时会调用$viewValue
)。在这里,我们看到$render docs被调用,然后更新$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
,因为它会触发{{1}}