问题标签 [angular2-changedetection]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
309 浏览

javascript - 首次加载应用程序时的Angular2更改检测

因此,当我第一次加载我的应用程序时,只加载了静态内容,即我拥有异步管道的内容根本没有呈现(通常应该在服务器响应之后呈现)。仅当我将鼠标悬停在链接或其他内容上时才会加载动态内容。感觉就像根本没有触发更改检测。有人知道为什么会发生这种情况吗?任何帮助将不胜感激。一直停留在这个问题上。谢谢。

0 投票
4 回答
109639 浏览

angular - markForCheck() 和 detectChanges() 有什么区别

ChangeDetectorRef.markForCheck()和 和有什么不一样ChangeDetectorRef.detectChanges()

我只找到了关于 SO之间区别的信息NgZone.run(),但没有找到这两个函数之间的区别。

对于仅参考文档的答案,请说明一些实际场景以选择其中一个。

0 投票
1 回答
594 浏览

angular - 如何防止 Firebase 在 Angular 2 中重复触发更改检测?

Firebase 使用大量内部异步调用来触发更改检测,因为 Angular/Zone 猴子修补 websocketsetInterval等。即使我没有与我的应用程序交互,我也看到一连串的更改检测一直在发生,这有助于放慢速度,尤其是在移动设备上。

这种默认行为可能很有用,但是我现在使用 Firebase 的方式我可以非常严格地控制何时需要更新视图,因此 Firebase 的回调以这样一种方式使用,即无论如何都会手动进行更改检测。

我知道将更改检测器策略设置为OnPush将对此有所帮助,我正在努力,但我想从各个角度进行攻击。

我熟悉区域,runOutsideAngular但现在不确定是否在此处应用它,因为所有异步调用都发生在 Firebase 模块中。

如何让 Firebase 在 Angular 区域之外开展所有业务?


编辑:显示问题的示例代码:

0 投票
2 回答
1509 浏览

angular - Angular2模板表达式在变化检测中为每个组件调用两次

相当标准的情况。

有一个父组件<item-list>。在其模板内*ngFor生成了 20 个子组件<item-block>[ngStyle]使用调用 function的指令和模板表达式设置的子组件样式setStyles()

问题(或者可能不是)是,当在一个特定子元素上发出任何事件时,表达式setStyles()会为每个子组件执行两次。

因此,如果我们在示例中单击一个特定项目,并且我们有 20 个<item-block>组件 -setStyles()将执行 20+20 次。

问题是

  1. 为什么它会发生,它是预期的行为。
  2. 它如何影响性能
  3. 如何避免 - 每个子组件/检测更改只有一次调用。

示例 & plnkr

plnkr(单击项目 - 打开控制台以进行调试输出)

0 投票
2 回答
893 浏览

angular - Angular2 - 通知子对象父对象已更改,因此子对象可以在其模板中重新触发 ngIf

我对这个问题有类似的问题,但似乎这个问题已经过时了,因为这两个答案都不适合我。

子组件只是从一个称为Proposal作为输入传递的复杂对象中呈现数据(它根本没有用户控件,因此不需要触发任何事件或传递任何东西)。

模板的相关部分是,迭代一个数组并检查一个属性以显示不同的文本,使用*ngIf

在父级中,用户可以单击复选框将“is_fitted”更改为 true 或 false。父级使用域驱动器形式。在ngOnInit父母是这个代码:

正确更新属性。我可以看到,如果我console.log这样做。*ngIf所以问题是,当嵌入的room.is_fitted值发生变化时,如何让孩子重新触发/重新处理?

我已经尝试使用 ViewChild 实现这个想法,因此 ngOnInit 中的上述代码变为:

但这也不起作用。我在孩子中的 notifyChange 被成功调用:

但视图不会更新 -*ngIf逻辑不会被重新处理。

0 投票
2 回答
2365 浏览

angular - 为什么替换对象不会触发 Angular2 中的更改检测?

我通过服务将对象数组共享给我的组件。所以有一刻我想用新对象的属性替换数组对象的属性之一(我替换了对象)。所以我的共享对象应该在所有使用它的模板中更新。

https://plnkr.co/edit/0sRxSivEaEPLsNAJo7MV?p=preview

在我的情况下 //1 更改 app.ts 和 my.component.ts 中的模板值,但 //2 仅在 my.component.ts 中触发更改

我想知道为什么 //2 不更新 app.ts 模板,有没有办法在不循环槽对象属性的情况下做到这一点?

更新: 我设法通过使用 Object.assign() 解决了我的问题。更换对象时没有变化检测。

0 投票
3 回答
25426 浏览

angular - 检测由父 Angular 2 触发的子组件变量的变化

我有 2 个文件。app.ts 和 Child.ts

我正在从应用程序向孩子发送一个变量,我想检测变量的任何变化并相应地显示数据。我无法检测到变量的变化。

有什么帮助吗?我附上了 Plunker Link 并且我还在评论中解释了我想在 Child.ts 文件中执行的操作

应用程序.ts 文件

Child.ts 文件

Plunker 链接

0 投票
2 回答
455 浏览

javascript - Worker.onmessage 后的 angular2 更改检测无法按预期工作

我在我的 angular2 应用程序中遇到了一个非常有趣的问题,我在这里简化了情况。

这是 AppComponnet

这是模板

工人完成后,我将一个新标签推送到标签。并且 Angular2 在 Worker onmessage 回调之后不会进行更改检测,我必须手动触发更改检测。

但是在那之后,点击后添加的选项卡中列表的背景不会改变(回调函数被执行,所以改变检测不起作用)。

如果我执行其他操作,例如再次单击“添加选项卡”按钮,更改检测将起作用并按预期设置列表背景。

如果我不手动触发更改检测。按下选项卡后,执行其他操作(例如再次单击按钮)以触发更改检测。现在列表将显示,并且背景更改效果很好。

我知道关键是在 Worker 执行后手动调用更改检测,但我不知道详细发生了什么导致列表背景更改检测不起作用。

0 投票
1 回答
1046 浏览

angular - Angular 2 + OnPush:更改检测不适用于 pouchdb 回调

我在离子应用程序中使用 Angular 2 并结合 PouchDB 作为数据库。出于性能原因,我选择在任何地方使用 OnPush+Async 管道。我现在偶然发现了一个事实,即如果 pouchdb 事件导致更改,它不会反映在模板中:

我有一个数据库类,它只计算数据库更改的数量:

在模板中,我使用异步管道显示数字:

但这不起作用:数字卡住了,即使有数据库更改(控制台输出显示数据库更改的次数)。但是,如果我点击某个东西,数字会突然跳到正确的值。

我觉得这很令人惊讶,因为我认为异步管道通过订阅一个可观察对象来工作,一旦这个可观察对象发出一些东西,模板内的值就会更新。显然,这在这里不起作用,因为我知道 observable 发出了一些东西(正如我从控制台输出中看到的那样),但更改并未反映在模板中。

你知道是什么导致了这种行为/如何改变它?

附加信息

为了确定是 pouchDB <> Angular 的组合导致了问题,我使用了这个函数

这会导致模板内的值每秒正确更新。

编辑

我发现这个虚拟代码

解决了这个问题,因为它可能每秒触发一次更改检测。我不明白的是,为什么异步管道没有检测到更改?

0 投票
1 回答
3587 浏览

angular - Angular 2 OnPush 动态组件的变化检测

我有一个 Angular 组件,它在自身内部动态创建各种其他类型的组件。@Input它通过OnChanges钩子将自己的属性绑定到子组件属性。

当子组件的更改检测设置为默认值时,此绑定可以正常工作。然后检测到新输入并更新组件模板。

但是,当更改检测为 OnPush 时不起作用,则不会检测到更改。我相信应该检测到这种变化,因为一个新的不可变对象,一个字符串,被分配给一个组件@Input属性。

这是一个演示: https ://plnkr.co/edit/0wHQghtww2HXVbC27bC1

如何让这个父到动态子属性绑定与 ChangeDetectionStrategy.OnPush 一起使用?