代码: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);
});
}
});
}
};
});
答案 0 :(得分:7)
我想通过“不起作用”你的意思是当发生更改时,它不像所有$格式化程序一样运行并更新$ viewValue?
如果是这样,这是因为ngModelController监视“模型表达式”的变化,而不是观察它自己的$ modelValue。
请参阅以下行:https://github.com/angular/angular.js/blob/master/src/ng/directive/input.js#L1046-L1065
如果您更新模型,则会触发手表并启动所有机械装置。如果是$ modelValue,则ngModelController不知道更改。