Angular1.x中ngModel的$render的详解
这篇文章是我两年前在博客园写的,现在移植过来,不过Angular 1.x 在国内用的人已经不多了,希望能帮助到有需要的人 在我开始着手 ngModel 的领域时候,有一个问题很令我纠结,那就是 那么这个 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); }) } } } ) 我们分几种情况分析 这是鼠标没有经过指令的时候的样子
1.当我们使用 js 原生方法设置 input 的 val 值的时候,并且不执行 结果是这样的
然后,我们尝试在执行 js 原生改变 value 值之后,执行
我们可以大胆的预计 2.接下来我们尝试,使用 ng 原生改变 也就是说 现在我们注释掉 js 原生改变 value 的方法,而去使用
现在我们在
大家发现了吧, ctrl.$render = function() { element.val(ctrl.$isEmpty(ctrl.$viewValue) ? '' : ctrl.$viewValue); }; 这是其中一个, 另外一个真正体现 $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; }); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |