Javascript 是否可以编译修改后的指令模板而不使用转换?

Javascript 是否可以编译修改后的指令模板而不使用转换?,javascript,angularjs,Javascript,Angularjs,我一直在尝试使用transclusion来创建一个指令,该指令将其内容复制两份,并将其附加到原始模板中。在将这两个副本放回DOM之前,我试图修改它们的尝试失败了,我认为这是因为我误解了转换的工作原理 我还有一个问题,我认为这个问题不会得到回答,因为我认为前提可能是错误的 我需要采取一种新的方法来解决这个问题,我想知道放弃转换并在编译函数中弄脏我的手是否明智 我的新问题是,您能否获取“elem”的内容,使用JQlite制作它的两个副本,然后根据指令的父范围手动编译它们,并将它们添加回原始模板中

我一直在尝试使用transclusion来创建一个指令,该指令将其内容复制两份,并将其附加到原始模板中。在将这两个副本放回DOM之前,我试图修改它们的尝试失败了,我认为这是因为我误解了转换的工作原理

我还有一个问题,我认为这个问题不会得到回答,因为我认为前提可能是错误的

我需要采取一种新的方法来解决这个问题,我想知道放弃转换并在编译函数中弄脏我的手是否明智

我的新问题是,您能否获取“elem”的内容,使用JQlite制作它的两个副本,然后根据指令的父范围手动编译它们,并将它们添加回原始模板中

因此,如果像这样使用我的工具栏指令,其中工具栏标记的内容可以是用户想要的任何HTML

<div ng-controller="myController">
    <toolbar>
        <form name="formName" submit="myController.submit()">
            <div>
                ... some controls...
            </div>
        </form>
    </toolbar>
</div>

... 一些控件。。。
指令的模板是

<toolbar-inner>
    <div class="toolbar">
        <div transclude-main></div>
    </div>
    <div class="overflow">
        <div transclude-overflow></div>
    </div>
</toolbar-inner>

我的工具栏指令编译功能需要复制元素的内容,克隆它,重命名任何表单,这样我们就不会有重复的表单名称,然后针对父控制器编译一个副本并将其插入主插槽,然后对第二个副本执行同样的操作并将其插入溢出插槽

关键的事情是,在它的结尾,我应该有一个带有两个内容副本的指令,我的控制器应该有两个表单——myController.formName和myController.formName2

如果我在这里没有正确解释,请告诉我。我很确定这里的解决方案不应该涉及到转换,因此发布了第二个问题。它不是复制品

如果我能进一步详细解释,请询问

非常感谢

编辑:

我试着在下面的例子中做到这一点

我对此有一些问题:

A) 控制台中出现JS错误-TypeError:无法读取未定义的属性'childNodes'

B) 我假设我可以在预编译阶段弄乱模板,用新的HTML替换指令的内容,新的HTML由一个新模板和原始内容的两个副本合并而成。我可以看出,我必须根据$parent作用域编译它们,因为我的指令使用了一个隔离作用域(尽管在这个简化示例中不是严格必需的)

C) 无论如何,在替换指令元素的原始内容时,我遇到了另一个错误

我想我已经走到了一半,希望这次突然袭击能显示出我想要达到的目标,但我已经没有知识了

为了完整起见,这里是我尝试使用transclusion的plunk,它不起作用,因为在我开始在transclude函数中处理转置内容时,转置内容已经编译好了

你可以在我前面的问题中看到关于这一点的完整对话:


我让你的示例成功了。看

我不得不打电话给下面的人让它工作

$compile(clone)(scope.$parent);

对于ngTransclude:孤立问题,在这种情况下,当子transclude位于表单之外时,它只编译表单元素

这一点在Angular 1.5之前,它引入了恍惚

link: function(scope, element) {
      if (!element.find('ng-transclude').children().length) {
        element.find('button').append('<b style="color: red">Button1</b>');
      }
    }
链接:功能(范围、元素){
if(!element.find('ng-transclude').children().length){
元素。查找('button')。追加('Button1');
}
}

人们应该问,为什么不能使用ng repeat?为什么您喜欢修改html而不是将其制作为模板?因为我不知道在使用该指令时,该指令将包含哪些html。它可能包含表单,也可能不包含表单,也可能包含按钮、菜单、图标等。应用程序的作者可以使用我的工具栏来处理他们想要的任何内容。谢谢,我开始工作时会正确检查。我不知道你可以“重新编译”篡改后的转载内容。不过有一件事,我认为你不需要改变我的循环函数。其目的不是对表单进行顺序编号,而是简单地将原始名称保留在副本1中,并在第二个副本中的每个表单的名称后面附加一个“2”,除非我弄错了,否则我的原始代码就是这样做的。另外,使用javascript循环遍历克隆,这会像.find()一样深入DOM吗?啊,该死。当我在实际项目中使用它时,它失败了,错误如下。[ngTransclude:孤立]在模板中非法使用ngTransclude指令!未找到需要转换的父指令。元素:这似乎不是失败的指令,而是使用转换的子指令出现问题。child指令在所有其他情况下都能很好地工作,包括在这个指令中,如果您从'pre'函数中删除$compile行,我也更新了Plunk来进行查找。对于这个问题,问题是ng transclude内容是通过我们对$compile的手动调用进行编译的,因此当到达它时,内容已经在那里了,并且没有任何内容需要进行转换。看这个。也许,试试JEuvin提到的,即有后备内容,如果没有提供转包内容,就会显示。是的,我回复了JEuvin的评论。看起来在这个阶段手动编译会把子指令搞得一团糟,尤其是第三部分指令。我知道这是可能的,因为在将内容作为transcludeFn中的克隆提供给您之前,正常的transclude功能必须先编译内容。您是否要将包含转包内容的组件添加到表单中,因为在更新的示例中,如果这些组件不在f中,那么它会起作用