Angular 6 UI 在不使用父模板的情况下实施变更检测
Angular 6 UI implementing change detection without using parent template
我需要在 angular 中制作一个可重用的组件,它将被打包到一个 npm 模块中。作为 angular 的新手,我遇到了 UI 变化检测的障碍。
要让组件首先工作,应用程序需要进行 api 调用以收集数据 required 以进行设置,然后组件需要 运行 一些初始化。
this.dataService.getData().subscribe((data) => {
this.data = data;
this.npmComponent.init(this.data);
});
<app-npm-component></app-npm-component>
然后在我的组件中,我需要 运行 一组设置任务,之后它需要监听数据的变化,重新 运行 一组设置任务并更新 ui.
@Component({
...,
changeDetection: ChangeDetectionStrategy.OnPush
});
...
init(setupData: any): void {
this.cdr.detectChanges();
this.data = setupData;
}
<ul *ngIf="data.arrayOfStuff">
<li *ngFor="let item of data.arrayOfStuff">{{item}}</li>
</ul>
通常的 ChangeDection 实现会抛出一个错误:NullInjectorError:没有 ChangeDetectorRef 的提供者!因为数据不是通过模板从它的父级传递的。
实现这种事情的正确方法是什么?提前感谢您的宝贵时间。
编辑:我在 ViewChild 中找到了答案
@ViewChild(NpmComponent, {static: false}) npmComponent: NpmComponent;
输入 child
<app-npm-component [data]="setupData"></app-npm-component>
并且在 child 组件的 class
@Input() data;
Angular 将负责监听输入的变化。
您也可以使用异步管道进行订阅。
在parent组件中
setupData$ = this.dataService.getData();
并使用异步管道
将数据传递给child
<app-npm-component [data]="setupData$ | async"></app-npm-component>
无需订阅。
如果您需要通过函数运行数据使用映射
setupData$ = this.dataService.getData().pipe(map(data => yourFunction(data)));
我需要在 angular 中制作一个可重用的组件,它将被打包到一个 npm 模块中。作为 angular 的新手,我遇到了 UI 变化检测的障碍。
要让组件首先工作,应用程序需要进行 api 调用以收集数据 required 以进行设置,然后组件需要 运行 一些初始化。
this.dataService.getData().subscribe((data) => {
this.data = data;
this.npmComponent.init(this.data);
});
<app-npm-component></app-npm-component>
然后在我的组件中,我需要 运行 一组设置任务,之后它需要监听数据的变化,重新 运行 一组设置任务并更新 ui.
@Component({
...,
changeDetection: ChangeDetectionStrategy.OnPush
});
...
init(setupData: any): void {
this.cdr.detectChanges();
this.data = setupData;
}
<ul *ngIf="data.arrayOfStuff">
<li *ngFor="let item of data.arrayOfStuff">{{item}}</li>
</ul>
通常的 ChangeDection 实现会抛出一个错误:NullInjectorError:没有 ChangeDetectorRef 的提供者!因为数据不是通过模板从它的父级传递的。
实现这种事情的正确方法是什么?提前感谢您的宝贵时间。
编辑:我在 ViewChild 中找到了答案
@ViewChild(NpmComponent, {static: false}) npmComponent: NpmComponent;
输入 child
<app-npm-component [data]="setupData"></app-npm-component>
并且在 child 组件的 class
@Input() data;
Angular 将负责监听输入的变化。
您也可以使用异步管道进行订阅。
在parent组件中
setupData$ = this.dataService.getData();
并使用异步管道
将数据传递给child<app-npm-component [data]="setupData$ | async"></app-npm-component>
无需订阅。
如果您需要通过函数运行数据使用映射
setupData$ = this.dataService.getData().pipe(map(data => yourFunction(data)));