链接函数中的 Angular $compile 给出错误“RangeError:超出最大调用堆栈大小”

2024-01-19

我正在尝试从链接函数向自定义指令添加 ng-class 属性。但是当添加 ng-class 属性后使用编译函数时,它会抛出类似“RangeError:超出最大调用堆栈大小”的错误

请看下面的代码

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 call stack size exceeded” error.

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

Code

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);
      }
    }
  }
})

类似的答案 https://stackoverflow.com/questions/31061732/angularjs-custom-form-validation-directive-doesnt-work-in-my-modal/31062143#31062143

演示在这里 http://plnkr.co/edit/5DWS9ya8IZzqaLyykHhf?p=preview

但另一件事,我没有看到使用添加和删除类的代码有任何优势ng-class指示。当您设置表单控件的有效性时,您隐式地添加和删除ng-valid-compare-to(有效)和ng-invalid-compare-to(无效)类。因此无需创建额外的开销即可ng-class再次放置相同内容的逻辑。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

链接函数中的 Angular $compile 给出错误“RangeError:超出最大调用堆栈大小” 的相关文章

  • 需要参考$log.log调用行号

    当我使用 Angular log 服务时 控制台中的所有行都会显示对 angular js 5687 的引用 而不是我调用 log log 函数的行 如何获得对我调用 log 的行的引用 另外 我有自己的围绕 log 的服务 如何引用对我的
  • 在父指令和子指令之间传递参数

    我有导航菜单的父指令和菜单链接的子指令 像这样的事情 menu menu
  • Chrome 打包应用程序 - 在后台/事件页面中使用 AngularJS

    当我们创建 Chrome 应用程序时 我们将脚本放在背景属性中清单 json file 这将用作应用程序的背景 事件页面 我想要的是 我想使用 AngularJS后台脚本但我不知道怎么办 还有 这可能吗 我刚看到一些答案 https sta
  • AngularJS 1.X 中的异步调用是如何工作的? $Http 调用没有返回值

    我有以下名为的函数getvalue 它与控制器一起位于 AngularJS 模块内 我试图在单击事件上调用此函数 调用控制器中的另一个函数 我希望我很清楚 功能 function getvalue Data http var value u
  • 如何使用 KendoUI 网格设置 CURD 以与 Kendo-Angular 和 Angular OData 工厂一起使用?

    在之前的项目中 我没有使用 Angular 我设置了一个Kendo DataSource使用 OData 端点 如下所示 var userDS new kendo data DataSource type odata transport r
  • 如何使用 Angular 创建 n 个可打印页面?

    嗯 我搜索了一下 没有找到类似的东西 我想知道如何使用 Angular 创建可打印内容 跳转到页面末尾并打印更多内容 如何强制内容始终适合特定尺寸 例如 PDF 我需要 Angular 来执行此操作吗 如果不是 HTML 我可以迭代 PDF
  • ng-repeat 仅具有特定属性值的对象 - 自定义过滤器?

    假设我有一个 JSON 对象 用户 其中包含一些基本属性 例如 名称 地址 角色 等 我希望 ng repeat 只吐出属性 角色 等于 管理员 的对象 我该怎么做呢 我正在考虑类似自定义过滤器的东西 或者可能创建一个范围变量 将匹配的对象
  • Angular JS未知提供者错误

    删除 Bower components 并清理缓存后 我使用 Bower install 重新安装了依赖项 该应用程序无法加载并出现以下错误 未捕获的错误 injector unpr 未知提供程序 forceReflowProvider 这
  • Internet Explorer Selenium Protractor e2e 测试

    我想在我们的 CI 构建过程中添加一些 e2e 测试 我已经针对 chrome firefox 添加了它们 作为最简单的 但我真的很想为几个 IE 版本做这件事 如何在 linux mac 上的构建过程中注入它 我发现这样的文章 http
  • 将 ngModel 绑定到自定义指令

    所以我已经在这个问题上工作了一个星期了 但我似乎无法理解整个指令的事情 我读了很多帖子 揭秘指令 http www toptal com angular js angular js demystifying directives 指令 ht
  • 身份验证在不应该返回“401(未经授权)”时返回

    我第一次设置身份验证功能 在用户登录后得到了一些意外的结果 一位同事给了我一个具有工作身份验证的应用程序 以模仿我的应用程序 看起来我所做的一切都是正确的 我在前端使用 AngularJS 在后端框架使用 SailsJS 并且护照JS ht
  • Angular UI 路由器嵌套视图问题

    我在理解 Angular UI Router 嵌套视图的工作原理时遇到了一些问题 我的 stateProvider 看起来像这样 stateProvider state login url login views main template
  • ui-sref 和变量状态参数名称

    我想呈现一个链接 例如 a 其中州名myState和钥匙myKey是变量 有办法做到这一点吗 我发现自己处于同样的情况 我也无法完成这一点 尝试使用 ng click 移动代码 并在 ng click 函数内部使用 stage go htt
  • AngularJS + jQuery 移动

    是否还有其他可能性来设计AngularJS以移动友好的方式应用程序CSS 我正在计划一个移动应用程序 并希望使用 AngularJS 进行逻辑和数据绑定 但我不想自己设计所有内容CSS The AngularJSFAQ说它使用jQuery
  • Angular JS - 使服务可以从控制器和视图全局访问

    假设我们有以下服务 myApp factory FooService function 然后 从控制器中 我会说 myApp controller FooCtrl scope FooService function scope FooSer
  • AngularJS:服务、提供商、工厂

    之间有什么区别Service Provider and Factory在 AngularJS 中 从我得到的 AngularJS 邮件列表一个惊人的线程 https groups google com forum msg angular 5
  • Firebase 未定义?

    我正在开发一个 Angular 项目并使用 Firebase 但出现错误ReferenceError Firebase is not defined 但我不明白为什么 这是我的index html
  • 如何在 AngularJS 中滚动到页面顶部?

    我想在使用 angularjs 获得 ajax 调用响应后滚动到页面顶部 基本上 我在页面顶部显示警报消息 并且希望在收到 ajax 响应时将警报消息集中显示 Thanks 您可以使用 window scrollTo x y where x
  • Angularjs - 如何纠正来自另一个不依赖的模块的注入服务?

    我不明白模块化如何工作 I have 3 modules they are dependent on each other as shown in the picture App 模块包括 module1 和 module2 module2
  • 喜欢和不喜欢用户对产品的评论

    用户架构 var UserSchema new Schema review likes type String review dislikes type String 审查架构 var ReviewSchema new Schema pro

随机推荐