【发布时间】:2018-07-03 02:15:57
【问题描述】:
这是指 Angular 1 应用程序。
如果 DOM 在我的 Angular 应用程序的上下文之外被修改,我知道我可以使用 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>
【问题讨论】:
-
您认为 $apply 会强制整个应用程序重新渲染(包括新注入的内容)的想法是错误的。 $apply 仅在检测到任何更改时触发所有观察者及其侦听功能。这些更改将更新之前编译的指令的 DOM。 $apply 不会编译和链接新指令。
标签: javascript angularjs