javascript - AngularJS DOM 注入(inject)

标签 javascript angularjs

如果我提前向 AngularJS 注册了一个面向元素的指令,那么我是否可以简单地直接向 DOM 中注入(inject)(例如通过 document.appendChild )一个与指令元素匹配的节点(例如 <my-directive-name my-attribute='foo'></my-directive-name> ),AngularJS 将渲染说指令代替它(可能需要手动摘要触发器)?

我的指令模板.html

  <div>
    hello world
  </div>

我的指令名称.js

function MyDirectiveName() {
        return {
            scope: {
              'myAttribute': '&',
            },
            template: template,
            replace: true,
            controller: controller,
            restrict: 'E',
            // ...
        };
}

Angular 配置:

//...
angular.directive('my-directive-name', require('my-directive-name'))
//...

启动 DOM:

<body></body>

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

<body>
   <my-directive-name my-attribute='foo'>
   </my-directive-name> 
</body>

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

结束 DOM:

<body>
   <div>
     hello world
   </div> 
</body>

最佳答案

您需要确保 $compile在将元素附加到 DOM 之前首先添加元素。这是一个简单的示例,展示了如何在 Angular 代码之外(通过 setTimeout)使用 $compile 函数来添加到 DOM。

(function(angular) {

  angular.module('myApp', [])
    .directive('myDirectiveName', MyDirectiveName);

  function MyDirectiveName() {
    return {
      restrict: 'E',
      template: '<div>Custom Directive with {{myAttr}} as my-attribute</div>',
      scope: {
        myAttr: '@myAttribute'
      }
    };
  }

  // run this later.
  setTimeout(function() {

    var appDiv = angular.element(document.getElementById('app'));
    // Get the injector to compile
    var $injector = appDiv.injector();
    var $compile = $injector.get('$compile');
    // compile new elems
    var barLink = $compile(angular.element('<my-directive-name my-attribute="bar"></my-directive-name>'));
    var bazLink = $compile(angular.element('<my-directive-name my-attribute="baz"></my-directive-name>'));

    // append both elements by linking against scope
    appDiv.append(barLink(appDiv.scope()));
    appDiv.append(bazLink(appDiv.scope()));
  }, 3000);
}(angular));
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="myApp" id="app">
  <my-directive-name my-attribute="foo"></my-directive-name>
</div>

关于javascript - AngularJS DOM 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31683220/

相关文章:

Javascript moment js 根据从当前时间到前一个午夜的小时数分割时间

javascript - 如何使用动态路径作为突变的有效负载从 Vuex 存储中删除条目?

Javascript获取其中包含数组键的字段数组的长度

javascript - 浏览器无法连接到 php websocket 服务器

javascript - 使选中的复选框在返回页面后保持选中状态

javascript - angularjs - 构建一个大型应用程序 - 所有路线都集中在一个地方?

javascript - Bootstrap 的 JavaScript 需要 jQuery 1.9.1 或更高版本

javascript - 使用 ng-include 简单显示 html 元素

javascript - Protractor 和 Angular : How to test two pages in an app, 一个接一个?

javascript - 使用 Sinon.js 为 Angular.js 应用程序设置 RESTful 后端模拟