代码之家  ›  专栏  ›  技术社区  ›  Simon Lang

强制angularjs指令链接到摘要循环之外

  •  1
  • Simon Lang  · 技术社区  · 7 年前

    这是指角度1应用。

    如果dom是在我的角度应用程序的上下文之外修改的,我知道我可以使用 angular.element(document.body).scope().$apply() 强制整个应用程序重新呈现,包括新注入的内容。

    然而,我的指示似乎从来没有联系。

    所以在下面的例子中,标记 <message></message> 应该呈现 Hello World ,但当手动注入,然后应用摘要时, link 方法似乎从未运行。

    https://jsbin.com/wecevogubu/edit?html,js,console,output

    javascript

    var app = angular.module('app', [])
    
    app.directive('message', function() {
      return {
        template: 'Hello, World!',
        link: function() {
          console.log('message link')
        }
      }
    })
    
    document.getElementById('button').addEventListener('click', function() {
      document.getElementById('content').innerHTML = '<message>default content</message>'
      var scope = window.angular.element(document.body).scope()
      scope.$apply()
    })
    

    HTML格式

    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="utf-8">
      <meta name="viewport" content="width=device-width">
      <title>JS Bin</title>
      <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.0/angular.min.js"></script>
    </head>
    <body ng-app="app">
      inside app:
      <message></message>
    
      outside app:
      <button id="button">Print another message</button>
      <div id="content"></div>
    </body>
    </html>
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Rodrigo Ferreira    7 年前

    根据文件,你可以用 angular.injector

    angular.injector 允许您在应用程序启动后插入和编译一些标记

    因此,示例的代码可以是:

    document.getElementById('button').addEventListener('click', function() {
      var $directive = $('<message>default message</message>');
      $('#content').append($directive);
    
      angular.element(document.body).injector().invoke(function($compile) {
        var scope = angular.element($directive).scope();
        $compile($directive)(scope);
      });
    })
    

    enter image description here

    希望这就是你要找的!