Angular 2 - 替代 $scope.$apply?
Angular 2 - Substitute for $scope.$apply?
$scope.$apply
将不再是 Angular 的一部分 2. 如果任何绑定属性已被删除,我们如何让 Angular 知道更新 DOM在常规 angular 执行上下文之外更改?
取自a blog post by Minko Gechev:
No more $scope.$apply
But how then AngularJS knows that anything outside it’s execution context has taken a place? Lets think where the changes might come from:
- setTimeout
- setInterval
- prompt (yeah, there are people who still use it…)
- XMLHttpRequest
WebSockets
…
答案是:
我知道修补浏览器内置 javascript 功能以通知对 Angular 的任何更改是可以以相对安全的方式完成的事情(不会引入细微的错误)并且会对开发者来说非常方便。但是第三方 API(例如 jQuery.fadeIn
)或者如果浏览器公开了一些未涵盖的新异步 API 怎么办?旧 $scope.$apply
的替代品是什么?
所以做所有这些猴子补丁的库是 zone.js。
jQuery.fadeIn
调用 setInterval
,setInterval
是猴子补丁,只要你在 zone.run
.
内调用 jQuery.fadeIn
zone.fork
和 zone.run
有点取代 $scope.$apply
,但它是不同的,因为它会在异步事情完成时检测自己,而你必须调用 $scope.$apply
手动 当你知道事情已经完成。
另请参阅此问题+答案:Use zone.js to detect current execution context from anywhere?
if the browser exposes some new asynchronous API which isn't covered?
我想他们也会修补那个。
如果一切都失败了,您仍然可以手动调用zone.afterTask()
。
我想这就是您要找的:)
- 从核心导入
NgZone
private zone: NgZone
在你的构造函数中
this.zone.run(() => {});
通常 scope.$apply
或
ChangeDetectorRef
private chRef: ChangeDetectorRef
chRef.detectChanges();
$scope.$apply
将不再是 Angular 的一部分 2. 如果任何绑定属性已被删除,我们如何让 Angular 知道更新 DOM在常规 angular 执行上下文之外更改?
取自a blog post by Minko Gechev:
No more $scope.$apply
But how then AngularJS knows that anything outside it’s execution context has taken a place? Lets think where the changes might come from:
- setTimeout
- setInterval
- prompt (yeah, there are people who still use it…)
- XMLHttpRequest
WebSockets
…
答案是:
我知道修补浏览器内置 javascript 功能以通知对 Angular 的任何更改是可以以相对安全的方式完成的事情(不会引入细微的错误)并且会对开发者来说非常方便。但是第三方 API(例如 jQuery.fadeIn
)或者如果浏览器公开了一些未涵盖的新异步 API 怎么办?旧 $scope.$apply
的替代品是什么?
所以做所有这些猴子补丁的库是 zone.js。
jQuery.fadeIn
调用 setInterval
,setInterval
是猴子补丁,只要你在 zone.run
.
jQuery.fadeIn
zone.fork
和 zone.run
有点取代 $scope.$apply
,但它是不同的,因为它会在异步事情完成时检测自己,而你必须调用 $scope.$apply
手动 当你知道事情已经完成。
另请参阅此问题+答案:Use zone.js to detect current execution context from anywhere?
if the browser exposes some new asynchronous API which isn't covered?
我想他们也会修补那个。
如果一切都失败了,您仍然可以手动调用zone.afterTask()
。
我想这就是您要找的:)
- 从核心导入
NgZone
private zone: NgZone
在你的构造函数中this.zone.run(() => {});
通常scope.$apply
或
ChangeDetectorRef
private chRef: ChangeDetectorRef
chRef.detectChanges();