Input里面模型的值:{{vm.modelTest}}<input type="text" ng-model="vm.modelTest" model-render>
.directive("modelRender", function () {return {require: "ngModel",link: function (scope, iElm, iAttrs, ngModelCtrl) {iElm.on("mouseenter", function () {//尝试注释iElm.val(1);console.log(ngModelCtrl);//尝试注释ngModelCtrl.$setViewValue(11);console.log(ngModelCtrl);//尝试注释ngModelCtrl.$render();console.log(ngModelCtrl);}) }}})我们分几种情况分析
现在我们注释掉js原生改变value的方法,而去使用$setViewValue,并且不执行$render函数,直接上结果,我们看到,执行完$setViewValue之后,无论是viewValue和modelValue都是已经同步了,但是input里面的值却依然是test,在这里我们再次验证了那个说法($viewValue和DOM节点的value是不同的)
现在我们在$setViewValue之后使用,$render()看看是什么效果,
大家发现了吧,$render的功能和$apply的功能极为相似,但是是不是很多人在讲$render的时候,都会说model同步到view,我觉得这个说法不太对,我测试过在click事件用非常规手段改变controller中model的值,发现就算controller的值已经改变了,但是ngModel的值无论是viewValue还是modelValue都没有变化,然后尝试用$modelValue的属性强行改变$modelValue,结果还是没作用。
我们下面来看看$render的源码
ctrl.$render = function() {element.val(ctrl.$isEmpty(ctrl.$viewValue) ? "" : ctrl.$viewValue); };这是其中一个,$render在不同的指令下的代码都不太一样,但是其作用基本一致,但是从这里我们就可以看出$render的到底在干什么事了。那么$render什么时候触发呢?其实看你自己想什么时候调用它,你可以覆盖他的方法,重写,在$watch也好,$viewChange也好。默认的触发事件一些特别input的value改变的时候例如单选,还有rollbackView()的时候
$scope.$watch(function ngModelWatch() { //解析ngModel的表达式,获取内容var modelValue = ngModelGet($scope);// if scope model value and ngModel value are out of sync// TODO(perf): why not move this to the action fn? //判断表达式的值是否跟modelValue一致if (modelValue !== ctrl.$modelValue &&// checks for NaN is needed to allow setting the model to NaN when there"s an asyncValidator(ctrl.$modelValue === ctrl.$modelValue || modelValue === modelValue)) { //更新modelValue的值 ctrl.$modelValue = ctrl.$$rawModelValue = modelValue; parserValid = undefined; //获取管道信息 var formatters = ctrl.$formatters, idx = formatters.length; var viewValue = modelValue; while (idx--) {viewValue = formatters[idx](viewValue); } //如果viewValue和ModelValue不一致 if (ctrl.$viewValue !== viewValue) {ctrl.$viewValue = ctrl.$$lastCommittedViewValue = viewValue;ctrl.$render();ctrl.$$runValidators(modelValue, viewValue, noop); }} //返回解析的表达式return modelValue; });}];以上就是小编为大家带来的浅谈Angular中ngModel的$render全部内容了,希望大家多多支持脚本之家~