Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.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 安格拉斯DOM注射_Javascript_Angularjs - Fatal编程技术网

Javascript 安格拉斯DOM注射

Javascript 安格拉斯DOM注射,javascript,angularjs,Javascript,Angularjs,如果我提前向AngularJS注册了一个面向元素的指令,那么我是否可以直接向DOM(例如通过document.appendChild)注入一个与该指令元素匹配的节点(例如),AngularJS将在其位置呈现该指令(可能需要手动摘要触发器) 我的指令模板.html <div> hello world </div> 角度配置: //... angular.directive('my-directive-name', require('my-directive

如果我提前向AngularJS注册了一个面向元素的指令,那么我是否可以直接向DOM(例如通过
document.appendChild
)注入一个与该指令元素匹配的节点(例如
),AngularJS将在其位置呈现该指令(可能需要手动摘要触发器)

我的指令模板.html

  <div>
    hello world
  </div>
角度配置:

//...
angular.directive('my-directive-name', require('my-directive-name'))
//...
<body></body>
<body>
   <my-directive-name my-attribute='foo'>
   </my-directive-name> 
</body>
<body>
   <div>
     hello world
   </div> 
</body>
启动DOM:

//...
angular.directive('my-directive-name', require('my-directive-name'))
//...
<body></body>
<body>
   <my-directive-name my-attribute='foo'>
   </my-directive-name> 
</body>
<body>
   <div>
     hello world
   </div> 
</body>

然后动态附加一个子节点:

//...
angular.directive('my-directive-name', require('my-directive-name'))
//...
<body></body>
<body>
   <my-directive-name my-attribute='foo'>
   </my-directive-name> 
</body>
<body>
   <div>
     hello world
   </div> 
</body>

然后我做一些事情让Angular意识到有些事情已经改变了(这是什么?):

结束DOM:

//...
angular.directive('my-directive-name', require('my-directive-name'))
//...
<body></body>
<body>
   <my-directive-name my-attribute='foo'>
   </my-directive-name> 
</body>
<body>
   <div>
     hello world
   </div> 
</body>

你好,世界

在添加元素之前,需要对元素进行
$compile
编译。这里有一个小问题:


重复问题:

在将元素添加到DOM之前,您需要确保先添加元素。下面是一个简单的示例,演示如何在angular代码之外使用$compile函数(通过setTimeout)添加到DOM

(函数(角度){
angular.module('myApp',[])
.指令(“myDirectiveName”,myDirectiveName);
函数MyDirectiveName(){
返回{
限制:'E',
模板:“{myAttr}}作为我的属性的自定义指令”,
范围:{
myAttr:“@myAttribute”
}
};
}
//稍后再运行。
setTimeout(函数(){
var appDiv=angular.element(document.getElementById('app');
//让注入器编译
var$injector=appDiv.injector();
var$compile=$injector.get(“$compile”);
//编译新元素
var barLink=$compile(angular.element(“”));
var bazLink=$compile(angular.element(“”));
//通过链接作用域来追加这两个元素
appDiv.append(条链接(appDiv.scope());
appDiv.append(bazLink(appDiv.scope());
}, 3000);
}(角度);


你能发布简单的例子和所需的结果吗?我认为使用
ng if
应该很容易,但我可能不太明白你想要做什么。可能的重复一点也不觉得有棱角。我每天至少评论一篇关于angular的帖子,说同样的话。这与angular的目的背道而驰在极端边缘情况下操作DOM。在angular中,您应该针对数据而不是DOM进行编码。@Claies请指出,如果要呈现的指令事先不知道,并且不能满足您的“感觉有角度”要求,那么如何将其呈现到DOM AngularJS指令中。我甚至不确定我是否理解您在评论中提出的问题,但我使用了
ng if
ng show
ng repeat
等模板和组合,在大量项目中根据数据类型呈现内容。我无法为假设的“我不知道它提前了什么”提供解决方案键入问题;为什么您不提前知道应用程序流程中的某个地方?毕竟,您不会让用户选择他们希望在页面上呈现的HTML。。。。