AngularJS $ setViewValue()在$ parsers.push()中没有响应

时间:2013-11-20 16:12:52

标签: angularjs angularjs-directive

我有一个指令。它需要ngModel,并且在链接中,我应该能够使用modelCtrl参数结合使用$setViewValue();$render();来返回更改输入字段中的值并更新ngModel中存储的值。不幸的是,当我将modelCtrl传递给我的逻辑函数时,我无法使用$setViewValue();$render();,即使我将modelCtrl传递给函数。 (见小提琴: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);
            });
        }
    };
});

我在我写的另一个指令中有一些非常相似的东西,为什么它在这里失败?

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

1 个答案:

答案 0 :(得分:6)

从逻辑方法调用$ 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更改事件调用。

这应该是ngModelController。$ formatters []的工作,但遗憾的是,当$ setViewValue()

启动更改时,不应用格式化程序