如何在现有的父指令元素和子指令元素之间动态嵌套指令元素
How to dynamically nest a directive element in-between existing parent and child directive elements?
背景:
我正在使用一个自定义CMS,在那里我对代码库的访问权限有限。因此,在少数情况下,我计划使用JavaScript进行一些DOM操作。
问题:
我有一个容器指令,容器有普通的旧HTML项,但无法将这些项标记为来自服务器端的指令。此外,普通的旧HTML项包含作为指令的子内容。
示例:
这是以前的:
DIV[container-directive]
DIV.some-item-in-html
DIV[some-directive-in-the-content]
DIV.some-item-in-html
DIV[some-directive-in-the-content]
...
以下是DOM之后的样子:
DIV[container-directive]
DIV[container-item] <-- This is what needs to be inserted
DIV.some-item-in-html
DIV[some-directive-in-the-content]
DIV[container-item] <-- This is what needs to be inserted
DIV.some-item-in-html
DIV[some-directive-in-the-content]
...
问题:
有人对使用JavaScript在指令嵌套之间注入DOM元素的最佳方法提出建议吗?
一些想法:
我认为angular可以在编译之前操作DOM,但我想知道是否有办法在angular的框架内做到这一点。
另一个选项是来自容器指令的后链接功能,我可以将HTML项包装在名为"容器项"的指令元素中,然后手动$编译这些项。所以,我尝试了一下,但我得到了一个错误,该错误与内部已经有带transcluded内容的指令的项目有关。"ngTransclude"有些出乎意料。我认为这与已经处理的内部指令有关。
我会选择您的第一个选项,并在角度编译之前操作DOM。
您可以在包含要操作的元素的指令中执行此操作。
例如:
app.directive('body', function() {
return {
restrict: 'E',
compile: function(element, attr) {
// find the inner element and wrap it
$('.some-item-in-html', element).wrap('<div class="container"></div>');
}
}
});
父指令总是在子指令之前编译,因此您可以在compile属性中更改子指令的DOM,而不必担心重新编译或重新链接指令。
[编辑]
感谢比亚乔的以下编辑。
此方法不应与带有模板的指令一起使用,因为元素将被分配给模板,而不是子元素。
另一种选择是在角度生命周期开始时运行的函数中进行DOM操作。
例如:
app.run(function(){
// find the inner element and wrap it
$('.some-item-in-html').wrap('<div class="container"></div>');
});
相关文章:
- 指令的模板必须只有一个根元素:With restrict E&替换true
- AngularJS指令,在元素后插入HTML
- AngularJS-将点击事件绑定到指令元素的子元素
- 离子指令元素不调用函数(绑定)更改
- 指令元素未显示
- 访问链接函数内的当前自定义指令元素
- 将指令属性添加到指令元素
- 将更新绑定到链接中的指令元素,而不是内联
. - AngularJs 指令元素子元素给出空
- AngularJS,指令元素为空
- 通过父控制器 AngularJS 设置指令元素属性
- AngularJS:如何判断我的控制器是否绑定到我的ng-repeat指令元素?我的数据没有显示
- JqueryDatePicker角度指令元素不工作
- 如何在现有的父指令元素和子指令元素之间动态嵌套指令元素
- Angular指令元素
- Angular指令-如何使用JQuery将ngModel和ngBind添加到自定义指令元素中
- 从控制器访问指令元素
- 如何从指令元素中删除角度观察者
- AngularJS子指令元素选择
- Angular.js指令元素的默认值