在AngularJS中调用ngModel的$ render时?

Mis*_*hko 23 angularjs angularjs-directive

在这个官方示例中,以下代码在做什么?

// model -> view
ctrl.$render = function() {
  elm.html(ctrl.$viewValue);
};
Run Code Online (Sandbox Code Playgroud)

据我所见,$render从未被称为.

什么时候$render实际叫?


UPDATE

看起来像$render被称为每次模式的转变.但是,当模型获得其初始值时,不会调用它.有没有办法控制初始值的渲染?

Kay*_*ave 31

$render当模型发生变化时,Angular会调用Right .根据$ render docs:

$渲染()

在需要更新视图时调用.预计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;
  });
}];
Run Code Online (Sandbox Code Playgroud)

它没有被调用初始值的原因是因为该指令末尾的这一行:

// load init value from DOM
ctrl.$setViewValue(elm.html());
Run Code Online (Sandbox Code Playgroud)

这会手动更新视图值而不会触发ngModelWatch(),因此无需通过$formatters$render.如果是那条线:

scope.content=elm.html();
Run Code Online (Sandbox Code Playgroud)

你会看到$renderAngular调用它会触发一个$watch

  • 谢谢你的详细解释!你能解释为什么在[这个例子](http://stackoverflow.com/q/21084088/247243)中,当模型改变时,不会调用`$ render`吗? (2认同)