Javascript 删除被转移的元素
我有一套定制的指令,可以通过nav标签有效地构建一个可嵌套的导航菜单。我之前有一些关于如何获取转义文本内容的问题。虽然我已经弄明白了,我现在想知道是否有任何方法可以删除一个转置的元素,这样它就不会出现在模板中了,您可以看到该元素正在获取被转置元素的文本。但是它仍然包含在Javascript 删除被转移的元素,javascript,angularjs,angular-directive,Javascript,Angularjs,Angular Directive,我有一套定制的指令,可以通过nav标签有效地构建一个可嵌套的导航菜单。我之前有一些关于如何获取转义文本内容的问题。虽然我已经弄明白了,我现在想知道是否有任何方法可以删除一个转置的元素,这样它就不会出现在模板中了,您可以看到该元素正在获取被转置元素的文本。但是它仍然包含在ng transcludediv中 您将能够在plunker中看到代码,但plunker中相应的代码段是: //Other Code Here controller:function($scope,$element,$attrs,
ng transclude
div中
您将能够在plunker中看到代码,但plunker中相应的代码段是:
//Other Code Here
controller:function($scope,$element,$attrs,$transclude){
this.parents = [];
var el = $transclude();
if(angular.equals($attrs.menuTitle, undefined)) {
$attrs.menuTitle= el.text().trim().split('\n')[0];
el.remove(); //Runs, still leaves the transcluded element
}
this.addSubmenu = function(parent){
this.parents.push(parent);
};
},
//Other Code Here
我对$transclude
价值的了解很少——我在这里工作的那篇文章,我只是在谷歌搜索和检查问题的过程中偶然发现的
我很感激你能提供的任何帮助。我不确定plunker应该显示什么,如果它起作用,所以很难告诉你如何实现它 希望我能告诉你更多关于transclude的事情 实际上,如果您想对元素转换有更多的控制,那么您可能希望在
link
函数中处理它,该函数具有以下特征
link: function (scope, element, attributes, controller, transclude)
然后,在链接函数中,您可以使用提供的transclude
函数对元素执行某些操作:
transclude(scope, function(clone, scope) {
element.append(clone);
});
第一个参数是要将转置的元素绑定到的范围
旁注:默认功能是控制器的一个新(非隔离)子作用域,指令位于该子作用域中。也就是说,如果您使用的是具有隔离作用域的指令,那么默认情况下,被转移的内容无法看到它。不过,在这个示例中,您可能不需要担心这个问题
第二个参数是一个函数,它接受克隆的元素和该元素的新范围。在该函数中,您可以将克隆
附加到指令的元素
,将其放在模板中的某个位置,在之前或之后,或者完全忽略它
最后,请记住,ng transclude本身就是一个指令。本质上,
ng transclude
是上述内容的现成实现(尽管它使用了不同的范围,如旁注中所述)。同样地,如果您使用transclude
功能并且您的模板中仍然有ng transclude
,那么您将找到两个已转置元素的副本。换言之,如果您自己不手动转写内容,则只能使用ng transclude
。您可以删除ng transclude
,并使用$transclude
功能手动执行转写,如下所示:
$transclude(function (clones) {
if ($attrs.menuTitle === undefined) {
$attrs.$set('menuTitle', clones.text().trim().split('\n')[0]);
}
var children = [];
angular.forEach(clones, function (el) {
// only transclude DOM node that you need here
if (el.nodeName === 'PARENT' || el.nodeName === 'CHILD') {
children.push(el);
}
})
$element.find('div').append(children);
});
示例Plunker:只需删除
ng转置
?这是我找到的获取文本的唯一方法,而且这些菜单将嵌套在沿途更远的地方,因此我需要转置。预期的结果是什么?我理解您只想删除用作menutile的文本元素,并保留child指令原样显示。这是否正确?Text
应该将文本作为menutile属性放入,即添加到模板中标记为ng transclude的
的元素。这就是我想要的。我可以在以后把剩下的部分解决;现在只需要停止让文本在两个地方显示。让我去看看我是否可以让它工作,然后,将更新所发生的事情。编辑仍然给我同样的结果。我从元素中获取文本,即使调用remove方法,也不会发生任何事情。我试图避免使用compile()
,主要是因为我不理解它。你知道我甚至没有想过这一点。非常感谢。