问题标签 [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.
javascript - 首次加载应用程序时的Angular2更改检测
因此,当我第一次加载我的应用程序时,只加载了静态内容,即我拥有异步管道的内容根本没有呈现(通常应该在服务器响应之后呈现)。仅当我将鼠标悬停在链接或其他内容上时才会加载动态内容。感觉就像根本没有触发更改检测。有人知道为什么会发生这种情况吗?任何帮助将不胜感激。一直停留在这个问题上。谢谢。
angular - markForCheck() 和 detectChanges() 有什么区别
ChangeDetectorRef.markForCheck()
和 和有什么不一样ChangeDetectorRef.detectChanges()
?
我只找到了关于 SO之间区别的信息NgZone.run()
,但没有找到这两个函数之间的区别。
对于仅参考文档的答案,请说明一些实际场景以选择其中一个。
angular - 如何防止 Firebase 在 Angular 2 中重复触发更改检测?
Firebase 使用大量内部异步调用来触发更改检测,因为 Angular/Zone 猴子修补 websocketsetInterval
等。即使我没有与我的应用程序交互,我也看到一连串的更改检测一直在发生,这有助于放慢速度,尤其是在移动设备上。
这种默认行为可能很有用,但是我现在使用 Firebase 的方式我可以非常严格地控制何时需要更新视图,因此 Firebase 的回调以这样一种方式使用,即无论如何都会手动进行更改检测。
我知道将更改检测器策略设置为OnPush
将对此有所帮助,我正在努力,但我想从各个角度进行攻击。
我熟悉区域,runOutsideAngular
但现在不确定是否在此处应用它,因为所有异步调用都发生在 Firebase 模块中。
如何让 Firebase 在 Angular 区域之外开展所有业务?
编辑:显示问题的示例代码:
angular - Angular2模板表达式在变化检测中为每个组件调用两次
相当标准的情况。
有一个父组件<item-list>
。在其模板内*ngFor
生成了 20 个子组件<item-block>
。[ngStyle]
使用调用 function的指令和模板表达式设置的子组件样式setStyles()
。
问题(或者可能不是)是,当在一个特定子元素上发出任何事件时,表达式setStyles()
会为每个子组件执行两次。
因此,如果我们在示例中单击一个特定项目,并且我们有 20 个<item-block>
组件 -setStyles()
将执行 20+20 次。
问题是:
- 为什么它会发生,它是预期的行为。
- 它如何影响性能
- 如何避免 - 每个子组件/检测更改只有一次调用。
示例 & plnkr:
angular - Angular2 - 通知子对象父对象已更改,因此子对象可以在其模板中重新触发 ngIf
我对这个问题有类似的问题,但似乎这个问题已经过时了,因为这两个答案都不适合我。
子组件只是从一个称为Proposal
作为输入传递的复杂对象中呈现数据(它根本没有用户控件,因此不需要触发任何事件或传递任何东西)。
模板的相关部分是,迭代一个数组并检查一个属性以显示不同的文本,使用*ngIf
:
在父级中,用户可以单击复选框将“is_fitted”更改为 true 或 false。父级使用域驱动器形式。在ngOnInit
父母是这个代码:
正确更新属性。我可以看到,如果我console.log
这样做。*ngIf
所以问题是,当嵌入的room.is_fitted
值发生变化时,如何让孩子重新触发/重新处理?
我已经尝试使用 ViewChild 实现这个想法,因此 ngOnInit 中的上述代码变为:
但这也不起作用。我在孩子中的 notifyChange 被成功调用:
但视图不会更新 -*ngIf
逻辑不会被重新处理。
angular - 为什么替换对象不会触发 Angular2 中的更改检测?
我通过服务将对象数组共享给我的组件。所以有一刻我想用新对象的属性替换数组对象的属性之一(我替换了对象)。所以我的共享对象应该在所有使用它的模板中更新。
https://plnkr.co/edit/0sRxSivEaEPLsNAJo7MV?p=preview
在我的情况下 //1 更改 app.ts 和 my.component.ts 中的模板值,但 //2 仅在 my.component.ts 中触发更改
我想知道为什么 //2 不更新 app.ts 模板,有没有办法在不循环槽对象属性的情况下做到这一点?
更新: 我设法通过使用 Object.assign() 解决了我的问题。更换对象时没有变化检测。
angular - 检测由父 Angular 2 触发的子组件变量的变化
我有 2 个文件。app.ts 和 Child.ts
我正在从应用程序向孩子发送一个变量,我想检测变量的任何变化并相应地显示数据。我无法检测到变量的变化。
有什么帮助吗?我附上了 Plunker Link 并且我还在评论中解释了我想在 Child.ts 文件中执行的操作
应用程序.ts 文件
Child.ts 文件
javascript - Worker.onmessage 后的 angular2 更改检测无法按预期工作
我在我的 angular2 应用程序中遇到了一个非常有趣的问题,我在这里简化了情况。
这是 AppComponnet
这是模板
工人完成后,我将一个新标签推送到标签。并且 Angular2 在 Worker onmessage 回调之后不会进行更改检测,我必须手动触发更改检测。
但是在那之后,点击后添加的选项卡中列表的背景不会改变(回调函数被执行,所以改变检测不起作用)。
如果我执行其他操作,例如再次单击“添加选项卡”按钮,更改检测将起作用并按预期设置列表背景。
如果我不手动触发更改检测。按下选项卡后,执行其他操作(例如再次单击按钮)以触发更改检测。现在列表将显示,并且背景更改效果很好。
我知道关键是在 Worker 执行后手动调用更改检测,但我不知道详细发生了什么导致列表背景更改检测不起作用。
angular - Angular 2 + OnPush:更改检测不适用于 pouchdb 回调
我在离子应用程序中使用 Angular 2 并结合 PouchDB 作为数据库。出于性能原因,我选择在任何地方使用 OnPush+Async 管道。我现在偶然发现了一个事实,即如果 pouchdb 事件导致更改,它不会反映在模板中:
我有一个数据库类,它只计算数据库更改的数量:
在模板中,我使用异步管道显示数字:
但这不起作用:数字卡住了,即使有数据库更改(控制台输出显示数据库更改的次数)。但是,如果我点击某个东西,数字会突然跳到正确的值。
我觉得这很令人惊讶,因为我认为异步管道通过订阅一个可观察对象来工作,一旦这个可观察对象发出一些东西,模板内的值就会更新。显然,这在这里不起作用,因为我知道 observable 发出了一些东西(正如我从控制台输出中看到的那样),但更改并未反映在模板中。
你知道是什么导致了这种行为/如何改变它?
附加信息
为了确定是 pouchDB <> Angular 的组合导致了问题,我使用了这个函数
这会导致模板内的值每秒正确更新。
编辑
我发现这个虚拟代码
解决了这个问题,因为它可能每秒触发一次更改检测。我不明白的是,为什么异步管道没有检测到更改?
angular - Angular 2 OnPush 动态组件的变化检测
我有一个 Angular 组件,它在自身内部动态创建各种其他类型的组件。@Input
它通过OnChanges
钩子将自己的属性绑定到子组件属性。
当子组件的更改检测设置为默认值时,此绑定可以正常工作。然后检测到新输入并更新组件模板。
但是,当更改检测为 OnPush 时不起作用,则不会检测到更改。我相信应该检测到这种变化,因为一个新的不可变对象,一个字符串,被分配给一个组件@Input
属性。
这是一个演示: https ://plnkr.co/edit/0wHQghtww2HXVbC27bC1
如何让这个父到动态子属性绑定与 ChangeDetectionStrategy.OnPush 一起使用?