Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/458.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 删除被转移的元素_Javascript_Angularjs_Angular Directive - Fatal编程技术网

Javascript 删除被转移的元素

Javascript 删除被转移的元素,javascript,angularjs,angular-directive,Javascript,Angularjs,Angular Directive,我有一套定制的指令,可以通过nav标签有效地构建一个可嵌套的导航菜单。我之前有一些关于如何获取转义文本内容的问题。虽然我已经弄明白了,我现在想知道是否有任何方法可以删除一个转置的元素,这样它就不会出现在模板中了,您可以看到该元素正在获取被转置元素的文本。但是它仍然包含在ng transcludediv中 您将能够在plunker中看到代码,但plunker中相应的代码段是: //Other Code Here controller:function($scope,$element,$attrs,

我有一套定制的指令,可以通过nav标签有效地构建一个可嵌套的导航菜单。我之前有一些关于如何获取转义文本内容的问题。虽然我已经弄明白了,我现在想知道是否有任何方法可以删除一个转置的元素,这样它就不会出现在模板中了,您可以看到该元素正在获取被转置元素的文本。但是它仍然包含在
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()
,主要是因为我不理解它。你知道我甚至没有想过这一点。非常感谢。