在角度1.2中,我需要能够在不影响$modelValue
的情况下更新$viewValue
。我希望内部值为一个值,而用户认为是另一个值。我遇到的问题是设置$modelValue
最后在下一个摘要中设置$viewValue
。我目前的解决方法是使用$timeout
在下一个摘要中设置$viewValue
。
//...
link: function(scope, elem, attrs, ctrl) {
//...
var setter = $parse(attrs.ngModel).assign;
scope.$watch(attrs.otherValue, function(){
var viewValue = ctrl.$viewValue;
setter(scope, validate()); // validate returns undefined or value if valid
$timeout(function(){
if(ctrl.$viewValue !== viewValue){
ctrl.$viewValue = viewValue;
ctrl.$render();
}
});
});
//...
}
//...
基本上,我想在Angular 1.2中另一个字段发生变化时设置一个内部值
小提琴(丑陋的$timeout
解决方法):http://jsfiddle.net/TheSharpieOne/q1s7Lf7z/1/
TL; DR
在$modelValue
/ $parser
管道之外设置$formatter
会更改$viewValue
,我希望它只更改$modelValue
(内部值)。
答案 0 :(得分:1)
当任何事情触发模型更改时,如上例中的setter(scope, validate());
,它将触发$formatters
运行。 $formatters
传递$modelValue
,并且可以返回将用于$viewValue
的值。知道这一点,你可以使用一个简单的函数,只返回格式化程序中的$viewValue
。这样,以编程方式更新模型不会影响$viewValue
,因此不会更改<inputs>
ctrl.$formatters.push(formatter)
function formatter(modelValue){
return ctrl.$viewValue;
}
对于问题中的示例,您只想在$viewValue
为$modelValue
时返回undefined
。为此你可以使用它:
ctrl.$formatters.push(formatter)
function formatter(modelValue){
return modelValue === undefined? ctrl.$isEmpty(ctrl.$viewValue)? undefined : ctrl.$viewValue : modelValue;
}