我正在编写一个具有属性Mode(): string
的Angular组件。
我希望能够以编程方式设置此属性,而不是响应任何事件。
问题是在没有浏览器事件的情况下,模板绑定{{Mode}}
不会更新。
有没有办法手动触发此更改检测?
答案 0 :(得分:534)
尝试以下方法之一:
ApplicationRef.tick()
- 类似于AngularJS的$rootScope.$digest()
- 即检查完整的组件树NgZone.run(callback)
- 类似于$rootScope.$apply(callback)
- 即评估Angular区域内的回调函数。我想,但我不确定,这最终会在执行回调函数后检查完整的组件树。ChangeDetectorRef.detectChanges()
- 与$scope.$digest()
类似 - 即仅检查此组件及其子组件您可以将ApplicationRef
,NgZone
或ChangeDetectorRef
注入您的组件。
答案 1 :(得分:103)
我使用了接受的答案参考并想举个例子,因为Angular 2文档非常难以阅读,我希望这更容易:
导入NgZone
:
import { Component, NgZone } from '@angular/core';
将其添加到您的类构造函数
constructor(public zone: NgZone, ...args){}
使用zone.run
运行代码:
this.zone.run(() => this.donations = donations)
答案 2 :(得分:59)
我可以使用markForCheck()
更新它导入ChangeDetectorRef
import { ChangeDetectorRef } from '@angular/core';
注入并实例化
constructor(private ref: ChangeDetectorRef) {
}
最后标记更改检测
this.ref.markForCheck();
以下是markForCheck()的工作原理和detectChanges()的例子。
https://plnkr.co/edit/RfJwHqEVJcMU9ku9XNE7?p=preview
编辑:这个例子不再描述问题了:(我相信它可能正在运行一个更新的Angular版本,它已被修复。
(按STOP / RUN再次运行)
答案 3 :(得分:6)
在Angular 2+中,尝试@Input装饰器
它允许在父组件和子组件之间进行一些不错的属性绑定。
首先在父级中创建一个全局变量来保存该对象/属性 将传给孩子。
接下来在子节点中创建一个全局变量来保存传递的对象/属性 来自父母。
然后在父html中,使用子模板,添加方括号 带有子变量名称的表示法,然后将其设置为等于名称 父变量。例如:
<child-component-template [childVariable] = parentVariable>
</child-component-template>
最后,在子组件中定义子属性的位置,添加 输入装饰器:
@Input()
public childVariable: any
当您的父变量更新时,它应该将更新传递给子组件,这将更新其html。
另外,要触发子组件中的函数,请查看ngOnChanges。
答案 4 :(得分:0)
ChangeDetectorRef.detectChanges()-与$ scope。$ digest()类似-即,仅检查此组件及其子元素