为什么NgModelController。$ modelValue!= $ parse(attrs.ngModel)(范围)?

时间:2013-01-25 12:46:32

标签: javascript angularjs

代码:http://plnkr.co/edit/xPZM5E7tjYqlt5NIabIu?p=preview line-no:17

如果我使用ctrl.$modelValue = nVal;代替$parse(attrs.ngModel).assign(scope, nVal);,则在此代码中,它不起作用。你能指出原因吗?

angModule.directive('moChangeProxy', function ($parse) {
    return {
        require:'^ngModel',
        restrict:'A',
        link:function (scope, elm, attrs, ctrl) {
            var proxyExp = attrs.moChangeProxy;            
            scope.$watch(proxyExp, function (nVal) {
                if (nVal != ctrl.$modelValue) {
                    //ctrl.$modelValue = nVal;  // This does not work                  
                    $parse(attrs.ngModel).assign(scope, nVal); // This works well
                }
            });
            elm.bind('blur', function () {
                var proxyVal = scope.$eval(proxyExp);
                if(ctrl.$modelValue != proxyVal) {
                    scope.$apply(function(){
                        $parse(proxyExp).assign(scope, ctrl.$modelValue);
                    });
                }
            });
        }
    };
});

1 个答案:

答案 0 :(得分:7)

我想通过“不起作用”你的意思是当发生更改时,它不像所有$格式化程序一样运行并更新$ viewValue?

如果是这样,这是因为ngModelController监视“模型表达式”的变化,而不是观察它自己的$ modelValue。

请参阅以下行:https://github.com/angular/angular.js/blob/master/src/ng/directive/input.js#L1046-L1065

如果您更新模型,则会触发手表并启动所有机械装置。如果是$ modelValue,则ngModelController不知道更改。