Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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
Templates AngularJS';A';带有空模板的指令将标记复制到DOM_Templates_Angularjs_Directive - Fatal编程技术网

Templates AngularJS';A';带有空模板的指令将标记复制到DOM

Templates AngularJS';A';带有空模板的指令将标记复制到DOM,templates,angularjs,directive,Templates,Angularjs,Directive,对于我的项目,我要求定义的指令不修改DOM,也不在DOM中留下它们存在的工件。我似乎无法与AngularJS合作 考虑以下例子: <div empty-arg="some-param"></div> <div null-arg="another-param"></div> 编译后,我希望生成的DOM元素如下所示: <div></div> <div></div> <div empty-arg=

对于我的项目,我要求定义的指令不修改DOM,也不在DOM中留下它们存在的工件。我似乎无法与AngularJS合作

考虑以下例子:

<div empty-arg="some-param"></div>
<div null-arg="another-param"></div>
编译后,我希望生成的DOM元素如下所示:

<div></div>
<div></div>
<div empty-arg="some-param"></div>
<div null-arg="another-param"></div>

但是缺少模板似乎会导致AngularJS忽略替换请求,从而导致生成的DOM元素如下所示:

<div></div>
<div></div>
<div empty-arg="some-param"></div>
<div null-arg="another-param"></div>

如何强制AngularJS在编译后的DOM中去掉这些属性

在这里可以找到一个演示这一点的JSFIDLE:

更新:

可以在创建属性之后删除它们,但我真正想要的是利用template definition参数拦截DOM元素的创建,这样它就不会复制该指令。在版本1.0.3中,这似乎是不可能的。

实际上,“空arg”和“空arg”只是DOM元素的正常属性,AngularJS使用它们来标记要在元素上应用的指令

所以,若一个指令将从DOM元素中删除属性,那个实际上是不好的。例如,可以编写另一个指令来使用此属性修改其行为:在您可以看到的不同AngularJS库中,该指令控制使用
ngModel
属性来获取绑定元素的表达式

而且,由于这些属性已经存在于DOM树中,删除它们将导致DOM树修改,并可能导致性能问题

如果仍然不想删除这些属性,可以尝试修改链接函数的第二个参数:

attrs.$set('empty',undefined);
for(var i=0; i < tElement[0].attributes.length; i++){
    tElement.removeAttr(tElement[0].attributes[i].name)
};
但一般来说,我不建议这样做:您可以节省一些内存(但我不确定是否会节省—我认为应该对其进行基准测试),但随着DOM树的修改,您将获得更大的加载时间


但无论如何,要证明这是可能的。

如果要删除所有属性,可以在compile函数中执行:

attrs.$set('empty',undefined);
for(var i=0; i < tElement[0].attributes.length; i++){
    tElement.removeAttr(tElement[0].attributes[i].name)
};
for(var i=0;i


更新:正如@Josh在一篇评论中指出的那样,删除这些属性本质上会使这成为一个只运行一次的指令,并且链接函数中没有任何属性可用,从而使这个答案成为非答案/非解决方案。

您的用例是什么?为什么不想跟踪它?模板将有许多参数来定义给定元素的属性。复制它们会消耗大量内存,而在像手机这样内存有限的环境中,这是一件坏事。我还是不明白。在什么地方复制它们?在指令运行之前,它们已经在DOM中了。指令实际上要做什么?也许你可以使用注释而不是属性。它们以折叠的形式存在于dom中。我仍然不知道这是如何工作的。如果删除属性(正如@MarkRajcok的答案所示),则不能使用任何属性来更改DOM-编译是在DOM操作之前进行的。我不认为你可以在ngRepeat中使用它们。这不太正确。我不想删除所有属性,我想删除指令的属性及其参数字符串(如果有)。不过这个主意不错。我来试一试。对不起,我不明白“控件使用ngModel属性获取绑定元素的表达式”是什么意思。我知道这是什么意思,但我不理解这句话与这个问题的相关性。让我举个例子:我为一些非常定制的验证创建了一个指令,并使用“ngModel”属性让模型表达式能够验证它。若另一个指令从元素中删除了这个属性,那个么我的指令将无法得到模型表达式(除非我将它保存到指令的作用域中),但那个不是一个好的存储位置。