gpt4 book ai didi

angularjs - 链接函数中的 Angular $compile 给出错误 "RangeError: Maximum call stack size exceeded"

转载 作者:行者123 更新时间:2023-12-01 09:20:08 25 4
gpt4 key购买 nike

我正在尝试将 ng-class 属性添加到链接函数的自定义指令中。但是在添加 ng-class 属性后使用编译函数时,会抛出类似“RangeError: Maximum call stack size exceeded”的错误

请看下面的代码

MyApp.directive('twinField',function($compile){
return {
restrict:'A',
require:'ngModel',
scope:{
fval:'='
},
link:function(scope,ele,attr,ctrl){
ctrl.$validators.compareTo=function(val){
//alert(scope.fval)
return scope.fval==val
}
scope.$watch('fval', function(newValue, oldValue, scope) {
ctrl.$validate()
});
ele.attr("ng-class","addForm.cpassword.$error.compareTo?'errorpswd':''")//=""
$compile(ele)(scope);
}
}

})

当我直接在 html 中添加 ng-class 时它正在工作。

最佳答案

$compile(ele)(scope); 行在编译指令元素中,这将导致在无限循环中调用编译指令代码,这就是它给出 “RangeError: Maximum调用堆栈大小超出” 错误。

理想情况下,您应该结合使用编译和链接功能。在编译功能中,您需要添加 ng-class 属性,然后删除指令属性以避免指令元素无限期编译。然后使用指令链接函数的范围编译指令元素。

代码

myApp.directive('twinField', function($compile) {
return {
restrict: 'A',
require: 'ngModel',
scope: {
fval: '='
},
compile: function(tElement, tAttrs) {
console.log(tElement)

tElement.removeAttr('twin-field');

return function(scope, ele, attr, ctrl) {
ele.attr("ng-class", "addForm.cpassword.$error.compareTo?'errorpswd':''");
ele.attr("test", "{{test}}':''");
var compileFn = $compile(ele);
ctrl.$validators.compareTo = function(val) {
//alert(scope.fval)
return scope.fval == val
}
scope.$watch('fval', function(newValue, oldValue, scope) {
ctrl.$validate()
});
compileFn(scope);
}
}
}
})

Similar answer

Demo here

但另一方面,我认为您使用 ng-class 指令添加和删除类的代码没有任何优势。当您设置表单控件的有效性时,您正在隐式添加和删除 ng-valid-compare-to(on valid) & ng-invalid-compare-to(无效)类。所以没有必要创建额外的开销来让 ng-class 逻辑再次放置相同的东西。

关于angularjs - 链接函数中的 Angular $compile 给出错误 "RangeError: Maximum call stack size exceeded",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34805257/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com