我有两个指令,其中外部指令使用transclusion。它应该将attr附加到由inner指令生成的外部指令内的内容,但是attach attr似乎不起作用:
我也收到错误:
TypeError: Cannot read property 'childNodes' of undefined
我认为这与此有关。
如果我不使用inner指令并手动将html放在将由inner指令生成的外部指令中,那么一切正常:
这里的实际用例是我有两个指令。其中一个在搜索查询组件中,允许您使用特定语法构建搜索并在键入时对其进行验证,以便您知道是否存在任何语法错误。我还有一个扩展文本组件,其中一个功能是自动完成的。这两个组件都可以单独运行,但我尝试将功能组合在一起,以便我可以使用自动完成的查询构建器。我遇到的问题是,扩展文本组件的所有功能都没有实际添加到搜索查询组件中(就像这里没有将外部指令的任何功能添加到内部指令中一样)。
我在这里做错了什么(为什么我得到那个childNodes错误)?这不是组合两个指令的功能的方式,每个指令都有自己的模板吗?
注意
transclude: 'element'
而不是transclude = true
,但当我这样做时,输入甚至没有显示在页面上更新
基于@zeroflagL的建议,我删除了$ compile上使用但是它仍然不起作用
输入确实有ng-click,并且没有javascript错误,但是单击输入不会触发警报。
答案 0 :(得分:0)
element.find('.outer-inputs').append($compile(copyElement)($scope));
您不需要$compile
。
compile: function(element, attributes, transclude) {
不推荐在编译函数中使用transclude
。
工作示例:
compile: function(element, attributes) {
return {
pre: function($scope, element, attributes) {
},
post: function($scope, element, attributes, ctrl, transclude) {
transclude($scope, function(clone) {
var copyElement = clone.filter('.outer-copy');
copyElement.find('input').on('click', function() {
focus();
//$scope.$apply(); only if you change the model.
});
element.find('.outer-inputs').append(copyElement);
});
与问题无关:指令的控制器没用,因为它没有方法。您可以直接在指令中将focus()
添加到范围。
修改强>
在您的示例中,您编译的元素已经编译并且仍在构建中(链接后阶段)。那不行。您有效地尝试更改inner
指令。但是,如果指令是相互依赖的,那么outer
不应该与inner
混淆,或者它们彼此了解。在这种情况下,不需要攻击DOM,因为它们可以以其他方式进行互操作。