在Zone.js外调用markForCheck时,Angular如何触发变更检测?
Angular OnPush策略下变更检测触发的疑问解答
首先明确:不是Angular自动"感知"到了Zone外的操作,而是你调用的markForCheck()直接通知了Angular要启动变更检测。
具体拆解下逻辑:
markForCheck()的作用不止是把组件及其祖先标记为dirty状态,它内部还会调用Angular变更检测系统的调度方法,主动安排一次变更检测循环。- 你的代码里,setTimeout运行在Angular Zone之外,Zone.js确实没法追踪到这个异步操作的完成,自然不会自动触发变更检测。但当你修改
count后调用markForCheck(),就相当于手动给Angular发了一个指令:"这个组件和它的父组件们需要被检查更新了"。 - 对于OnPush策略的组件来说,只有当输入属性变化、组件内事件触发,或者像这样手动标记时,Angular才会执行对应的变更检测。这里的
markForCheck()就是手动触发的核心开关,它直接触发了变更检测周期的启动。
举个直白的例子:就像你在办公室加班,Zone是前台,平时前台看到你做完活会通知保洁来打扫(自动触发变更检测);但你要是躲在会议室加班(Zone外),前台看不到,这时候你得自己喊保洁(调用markForCheck()),保洁才会过来打扫。
内容的提问来源于stack exchange,提问作者noman tufail
相关产品推荐
相关产品推荐

