设置$ modelValue而不更改$ viewValue

时间:2014-12-15 19:08:28

标签: javascript angularjs angularjs-directive

在角度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(内部值)。

1 个答案:

答案 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;
}

工作示例:http://jsfiddle.net/TheSharpieOne/q1s7Lf7z/17/