【问题标题】:angularjs compile and link dom recursive manipulationangularjs编译链接dom递归操作
【发布时间】:2014-07-01 03:13:11
【问题描述】:

我已经使用 Angular 一个月左右了。我在处理 dom 操作时遇到问题。作为练习,我想创建一个将嵌套对象重复到树视图的指令。请不要向我发送在线示例的链接。我发现了很多,但大多数都没有解释他们在做什么,或者更重要的是为什么代码是这样编写的。

我创建了一个 plnkr 作为示例代码进行测试,位于此处:http://plnkr.co/edit/Zcx63dJZxQyDsjAHIALh?p=preview

我在网上找到的每个示例都说明所有编译函数都在 pre 或 post 链接之前运行,而 post 链接是应该注册和绑定事件的地方。我也可以在我的指令中使用链接或编译函数,编译函数返回一个发布链接。您可以在 plnkr 中看到一切都是这样设置的。

我了解链接函数可以采用创建元素克隆的 transclude 函数。这就是我卡住的地方。我试图将克隆附加到元素,但我总是让我的浏览器冻结并且没有响应。

在角度文档中它说:

注意:编译函数不能处理在自己的模板或编译函数中递归使用自身的指令。编译这些指令会导致无限循环和堆栈溢出错误。这可以通过在 postLink 函数中手动使用 $compile 来强制编译指令的模板来避免这种情况,而不是依赖于通过 template 或 templateUrl 声明的自动模板编译或在 compile 函数中手动编译

但是没有关于操作 dom 的过程的示例。我们如何使用编译处理链接函数中的递归?在某些示例中,他们清除元素 html 然后附加克隆。为什么?如何递归地构建和附加模板?将元素嵌入到模板中更好,还是将我的模板放在指令中然后克隆它更好?

我希望你能帮助我,因为我找不到任何关于 compile 函数的详细信息以及递归 dom 操作所需的步骤。如果您想提供帮助,请提供每行代码的说明。

感谢您的帮助,

【问题讨论】:

    标签: angularjs angularjs-directive angularjs-ng-repeat


    【解决方案1】:

    您好,我修复了 plunkr:http://plnkr.co/edit/gbeljxdShUazBJux7hXB

    我看到的最大问题是你的递归永远不会结束,这就是堆栈溢出的原因。

    如果您有任何问题,请告诉我。

    希望这会有所帮助。

    【讨论】:

    • 感谢您的帮助。您添加的解决方案是我在网上找到的实际代码之一,在某处有另一个 plnkr 帖子。我真正想要的是:是什么停止了递归?是对 tElem.contents().remove() 的调用吗?另一件事这条线做了什么:compiledContents = $compile(contents, transclude)? $compile 服务的文档在哪里,它需要什么参数,它返回什么?最后,在最后一次调用中如何使用返回值来克隆元素?为什么链接函数没有嵌入参数?你是怎么知道的?
    • 当模板中的代码:ng-repeat="node in nodes.children" 完成时递归停止。在您的 plunkr 中,您一遍又一遍地附加您的模板,没有结束
    • 至少给这个人一个积极有用的分数,让他努力回答你的问题。
    猜你喜欢
    • 1970-01-01
    • 2015-01-07
    • 2020-10-03
    • 2015-01-17
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-13
    相关资源
    最近更新 更多