我的应用程序结构如下,我的问题是如何在接收初始或未来数据时更新子组件视图,假设我只有一个具有事件 OnDataUpdate 的服务,所有子组件都接收相同的服务实例,因为它有另一方面,在 App 模块提供程序部分中声明,我尝试了所有这些方法并且没有工作:
- ApplicationRef.tick()
- ChangeDetectionRef.markForCheck()
- 变化检测策略
- 使用 OnDataRecieved 事件在组件之间共享服务,如下所示
@Injectable()
export class ApiService {
public OnDataRecieved: EventEmitter<Model> = new EventEmitter<Model>();
constructor(private http: HttpClient, private ngZone: NgZone) {
}
public getDataAsync(): Observable<Model> {
return this.http
.get<Model>('url')
.pipe(catchError(er => throwError(er)));
}
}
在 App 根组件中,这就像下面的代码
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'],
changeDetection: ChangeDetectionStrategy.Default
})
export class AppComponent implements DoCheck {
model: BehaviorSubject<Model> = new BehaviorSubject<Model>(new Model()); //with default values
subModel: BehaviorSubject<SubModel>;
constructor(private apiService: ApiService,
private zone: NgZone) {
this.apiService.getDashboard().subscribe((data) => {
this.zone.run(() => {
this.apiService.OnDataReceived.emit(data);
this.model = new BehaviorSubject<Model>(data);
});
});
this.model.subscribe((mdl) => {
this.subModel = new BehaviorSubject<SubModel>(mdl.subModel));
});
}
ngDoCheck() {
}
}
想象模型在加载或更改数据时嵌套并通过子组件传播,结构可以是这样的
__ AppRootComponent
|_____ Component1
|_________SubCompoent1-1
|_________SubCompoent1-2
|_____ Component2
|_________SubCompoent2-1
|____________SubCompoent2-1-1
我在 ngDoCheck 中收到数据变化,不需要触发检测变化,但是 UI 和子组件没有更新!