【发布时间】:2019-08-26 21:43:25
【问题描述】:
我遇到了一个奇怪的问题,我希望这只是一个简单的解决方法。 Angular 中的变更检测不仅仅在生产环境中起作用。
我使用 Angular 7 和 ngrx 作为状态管理构建了一个相当复杂的应用程序。有 2 个主要模块基于路由延迟加载。变更检测策略是 OnPush,99% 的应用程序遵循一种模式,数据来自服务器,通过 ngrx 效果到有状态组件,然后通过异步管道将数据推送到“虚拟”表示组件中。 示例:
this.loading$ = this.store.pipe(
select(selector.isLoading),
takeUntil(this.unsubscribe$)
);
<app-loading [loading]="loading$ | async"></app-loading>
在ng serve 和ng serve --prod 上,一切正常,没有问题。然而,在运行 ng build --prod 并将 js 文件推送到我们的 .net 解决方案后,更改检测停止工作。
“停止工作”是什么意思?我的意思是它不会改变任何模型或组件,除非发生了 DOM 事件。
例如,使用上面显示的代码,有一个加载微调器会一直显示,直到数据来自服务器。在生产中,微调器会一直停留在屏幕上,直到您随意点击。然后应用程序刷新并显示数据。此问题在整个应用程序中持续存在。也就是说,这个问题不仅仅发生在那里。
应用程序在 .Net 解决方案中的 .cshtml 文件中加载,如下所示:
<script type="text/javascript" src="runtime.js"></script>
<script type="text/javascript" src="polyfills.js"></script>
<script type="text/javascript" src="main.js"></script>
延迟加载的模块位于 .cshtml 文件的文件夹中,并且没有显示任何错误,因此我必须假设一切都已正确连接。
同样,这仅在产品包中。不在 dev 或 serve 或 prod 模式下服务。
【问题讨论】:
-
这个问题需要澄清。对我来说,当你说“它没有检测到产品变化”时,你需要刷新浏览器缓存。
-
也许这更多地针对 Angular 开发者。 Angular 有一个变更检测生命周期。当开发环境打开时,一切都按预期工作,但在构建并发送到服务器时却没有。
-
@Zze 我已经对问题进行了大量更新,以包含尽可能多的信息。希望这更有意义。
标签: angular deployment angular7 angular-cli-v7