我有一条指令。它需要ngModel,并且在链接中,我应该能够使用modelCtrl参数来结合使用$setViewValue();$render();返回以更改输入字段中的值并更新存储在。不幸的是,当我将ngModel传递给逻辑函数时,即使我将modelCtrl传递给函数,也无法使用$setViewValue();$render();。 (请参见小提琴:http://jsfiddle.net/GSTC5/1/

myApp.directive('demo', function() {
    return {
        require: 'ngModel',
        restrict: 'EACM',
        link: function(scope, element, attrs, modelCtrl) {
            setAndRender(modelCtrl, "12345");
            modelCtrl.$parsers.push(function(inputValue) {
                return logic(inputValue, modelCtrl);
            });
        }
    };
});


我在编写的另一个指令中也有类似的工作,为什么它在这里失败?

更新
我认为错误在于modelCtrl。我知道从链接函数调用它时它会做出响应,但是当从逻辑函数调用它时,$setViewValue()会阻止代码运行。

最佳答案

从逻辑方法中调用$ setViewValue,该方法触发另一个$ parsers循环,从而产生无限递归,从而导致RangeError: Maximum call stack size exceeded

ngModelController。$ parsers []影响生成的ngModelController。$ modelValue,如果您还想影响ngModelController。$ viewValue,则可以直接设置$ viewValue并调用ngModelController。$ render()以允许组件更新DOM。

http://jsfiddle.net/GSTC5/4/

ngModelController。$ setViewValue()仅应由DOM change事件调用。

这应该是ngModelController。$ formatters []的工作,但是遗憾的是,当由$ setViewValue()发起更改时,格式器未应用

关于angularjs - AngularJS $ setViewValue()在$ parsers.push()中无响应,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20101054/

10-11 01:45