由于某种原因,我必须在生产模式下运行我的应用程序。这些模式有什么区别?
在开发模式下,更改检测会在第一次运行后立即进行第二次运行,如果第一次和第二次运行之间任何绑定值发生更改,则会产生错误。这有助于定位检查值有副作用的错误,或者字段或函数在后续调用中不返回相同值的错误,从而破坏 Angular 的更改检测。
在开发模式下,在第二次更改检测运行期间,Angular 还会进行一些在生产中不会执行的深度对象比较,以检测不允许的模型更改。
更新:
在开发模式下,当 HTML sanitizer 服务从绑定
[innerHTML]="..."
或 [ngStyle]="..."
中删除值时,也会将提示打印到控制台。
另请参阅:在 RC.1 中,某些样式无法使用绑定语法添加
ApplicationRef.tick()的文档状态:
在开发模式下,
还会执行第二个更改检测周期(TTL = 2)以确保不会检测到进一步的更改。如果在第二个周期中发现其他更改,则应用程序中的绑定会产生无法在单次更改检测过程中解决的副作用。在这种情况下,Angular 会抛出错误,因为 Angular 应用程序只能进行一次更改检测,在此期间必须完成所有更改检测。
tick()
我们不能进行额外更改的原因是因为在生产模式下,更改检测仅运行一次,这意味着组件树中的每个组件都会检查一次(TTL = 1)...从顶部开始,深入-第一订单。 因此,例如,如果子组件的输入属性的更改导致父组件在视图/模板中绑定的某些其他属性发生更改,父组件的视图将不会更新(因为更改检测不会更新)在生产模式下重新访问父组件...因为“一次通过”树遍历)。 它只会在下次发生某些事件并再次运行更改检测时更新 - 但为时已晚!
这里有一个 Plunker 违反了规则——子组件在一个输入属性上有一个
set
方法,可以修改另一个输入属性。是的,这是一个人为的例子,但它比下一个更容易理解:
您可能遇到此问题的另一种情况是使用有状态管道。 如果这是您的问题,请查看此答案。
您应该描述您的问题(在另一个问题中)。 应该有办法解决它。
Angular 中的生产模式是什么?
Angular 中的生产模式是指为在实时环境中部署而优化的应用程序模式。它与开发模式在几个关键方面有所不同:
默认情况下,Angular 应用程序在开发模式下运行,除非另有明确配置。
在 Angular 中,有多种方法可以在开发模式和生产模式之间切换,具体取决于应用程序的构建和部署方式。