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

标签 angularjs angularjs-directive

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

最佳答案

从逻辑方法调用 $setViewValue,这会触发另一个 $parsers 循环,创建无限递归,导致 RangeError:超出最大调用堆栈大小

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

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

ngModelController.$setViewValue() 只能由 DOM 更改事件调用。

这应该是 ngModelController.$formatters[] 的工作,但遗憾的是,当 $setViewValue() 启动更改时,格式化程序并未应用

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

相关文章:

javascript - Angularjs教程第7步;无法看到动态创建的列表

javascript - 获取 ng-repeat 的匹配 ng-if 的数量

javascript - 如果元素未更改,则阻止调用 $watch

angularjs - 将 angularjs 指令转换为 angular 10

javascript - 当元素在 angularjs 中显示或隐藏时,如何在指令中获取监视函数来触发

twitter-bootstrap - 如何使用 ng-show/ng-hide 在 Angular Bootstrap UI 中隐藏选项卡

javascript - 在 AngularJS 中使用指令时如何使表单无效

javascript - 使用 ng-repeat 创建特定元素后隐藏它们

javascript - 两个指令之间的 Angular 指令范围共享

javascript - 如何监控输入的变化