我有一个指令。它需要 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。
ngModelController.$setViewValue() 只能由 DOM 更改事件调用。
这应该是 ngModelController.$formatters[] 的工作,但遗憾的是,当 $setViewValue() 启动更改时,格式化程序并未应用
关于AngularJS $setViewValue() 在 $parsers.push() 中没有响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20101054/