4

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

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

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);
                    });
                }
            });
        }
    };
});
4

1 回答 1

7

我猜“不起作用”是指当发生更改时,它不会像所有 $formatters 那样运行东西并更新 $viewValue?

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

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

如果你更新模型,那么手表就会被触发,所有的机器都会投入使用。如果您使用 $modelValue,则 ngModelController 不会意识到更改。

于 2013-01-25T13:11:17.083 回答