代码:http://plnkr.co/edit/xPZM5E7tjYqlt5NIabIu?p=preview 行号: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);
                    });
                }
            });
        }
    };
});

最佳答案

我猜这是“不起作用”,它表示更改发生时,它不会运行所有$ formatters之类的东西并更新$ viewValue吗?

如果是这样,这是因为ngModelController监视“模型表达式”中的更改,而不是监视其自己的$ modelValue。

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

如果更新模型,则将触发手表,并且所有机械都将投入使用。如果您使用$ modelValue,则ngModelController不知道更改。

07-28 07:19