出于某种原因,我必须在生产模式下运行我的应用程序。这些模式有什么区别?
答案 0 :(得分:70)
在开发模式下,更改检测会在第一次运行后立即执行第二次运行,并在第一次和第二次运行之间更改任何绑定值时生成错误。这有助于找到检查值具有副作用的错误,或者字段或函数在后续调用中不会返回相同的值,这会破坏Angular的更改检测。
在开发模式下,在第二次更改检测运行期间,Angular还会进行一些深层对象比较,以便在生产中不会检测到不允许的模型更改。
<强>更新强>
在开发模式下,当HTML清理程序服务从绑定[innerHTML]="..."
或[ngStyle]="..."
中删除值时,还会向控制台打印提示。
另见:In RC.1 some styles can't be added using binding syntax
答案 1 :(得分:35)
在开发模式下,
tick()
还执行第二个更改检测周期(TTL = 2),以确保不会检测到进一步的更改。如果在第二个周期中拾取了其他更改,则应用中的绑定会产生无法在单个更改检测过程中解决的副作用。在这种情况下,Angular会抛出一个错误,因为Angular应用程序只能有一个更改检测通道,在此期间必须完成所有更改检测。
我们无法进行其他更改的原因是因为在生产模式下,更改检测仅运行一次,这意味着组件树中的每个组件都会检查一次(TTL = 1)...从顶部开始深度优先。 因此,例如,如果对子组件的输入属性的更改导致更改父组件在视图/模板中绑定的某些其他属性,则父组件的视图将不会更新(因为更改检测不会在生产模式下重新访问父组件...因为“一遍”树遍历)。它只会在下次发生某些事件时更新并且更改检测再次运行 - 但为时已晚!
这是一个违反规则的Plunker - 子组件在输入属性上有一个set
方法,用于修改另一个输入属性。是的,这是一个人为的例子,但它比下一个更容易理解:
您可能遇到此问题的另一种情况是使用有状态管道。如果那是您的问题,请查看this answer。
您应该描述您的问题(在另一个SO问题中)。应该有办法解决它。