Принудительная директива AngularJS для связи вне цикла дайджеста - PullRequest
0 голосов
/ 03 июля 2018

Это относится к приложению Angular 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 Ответ

0 голосов
/ 03 июля 2018

Согласно документации, вы можете сделать это с помощью 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

Надеюсь, это то, что вы ищете!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...