javascript – 外部承诺不会触发Angular2变更检测(更新:他们这样做)

我正在开发一个electron应用程序,其客户端是在Angular2编写的.

我遇到很多人遇到的经典问题(例如herehere),即我正在更新组件的数据,但视图没有更新,因为Angular不知道数据有改变.人们建议的解决方案(见上文和here)是在整个组件树上或部分树上手动运行变更检测(类似于Angular 1的$rootScope.$digest和$scope.$digest).

但是,我想避免在zone.run()调用中包装我的所有数据更改,因为它略微违背了使用Angular的目的.

我很确定我知道为什么会发生这种情况:我在Angular之外用电子代码(即main process)创建Bluebird Promises,这些不是Zone知道的,所以他们不会通知Angular这些变化.

不过,我不知道如何解决它.如何在我的电子代码中创建区域感知承诺,以避免必须始终手动运行变更检测?我能否以某种方式将我的蓝鸟承诺转换为区域感知承诺?

编辑:我认为我错了,即使在角度内创建,Bluebird承诺也不会识别区域.他们一般不知道区域.

编辑2:我在上一次编辑中完全错了. Bluebird承诺使用区域可以正常工作.但是,在电子应用程序的上下文中,在主电子过程中创建承诺并在渲染器过程中使用它(Angular生活的地方)不起作用,因为返回的承诺不是区域感知的.从Angular代码创建承诺.

最佳答案
Promise不会使用ChangeDetectionStrategy.OnPush进行Angular运行更改检测,除非您使用异步管道…异步.

当代码在Angular2之外初始化时,它在Angulars区域外运行.你可以做的是在Angular2代码中移动初始化或使用’zone.run(…)在Angulars区域内移动执行.关于zone.run(…)`没什么不好的.

如果执行的代码仅更改组件的本地属性,则可以使用ChangeDetectorRef.detectChanges()为此组件运行更改检测.

如果代码导致其他组件发生更改(例如this.router.navigate(…)),那么detectChanges()是不够的.对于这种情况,应该使用zone.run().

setTimeout(…)触发整个应用程序的更改检测,应该避免手动调用更改检测.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


kindeditor4.x代码高亮功能默认使用的是prettify插件,prettify是Google提供的一款源代码语法高亮着色器,它提供一种简单的形式来着色HTML页面上的程序代码,实现方式如下: 首先在编辑器里面插入javascript代码: 确定后会在编辑器插入这样的代码: <pre
这一篇我将介绍如何让kindeditor4.x整合SyntaxHighlighter代码高亮,因为SyntaxHighlighter的应用非常广泛,所以将kindeditor默认的prettify替换为SyntaxHighlighter代码高亮插件 上一篇“让kindeditor显示高亮代码”中已经
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面
如何用js控制图片放大缩小
JS怎么获取当前时间戳
JS如何判断对象是否为数组
JS怎么获取图片当前宽高
JS对象如何转为json格式字符串
JS怎么获取图片原始宽高
怎么在click事件中调用多个js函数
js如何往数组中添加新元素
js如何拆分字符串
JS怎么对数组内元素进行求和
JS如何判断屏幕大小
js怎么解析json数据
js如何实时获取浏览器窗口大小
原生JS实现别踩白块小游戏(五)
原生JS实现别踩白块小游戏(一)