Angular 4-填充子组件数据的最佳方式
我在父组件中使用@ViewChild,父组件取决于子组件属性。现在,子组件从在ngoninit中完成的REST调用中获取数据。在父组件中,我使用了NgaAfterViewInit,以便能够获得子组件的数据,但是当第一次初始化发生时调用NgaAfterViewInit,并且没有查看任何后续视图更改(在第一个NgaAfterContentChecked()之后调用一次)。像下面这样 子组件Angular 4-填充子组件数据的最佳方式,angular,Angular,我在父组件中使用@ViewChild,父组件取决于子组件属性。现在,子组件从在ngoninit中完成的REST调用中获取数据。在父组件中,我使用了NgaAfterViewInit,以便能够获得子组件的数据,但是当第一次初始化发生时调用NgaAfterViewInit,并且没有查看任何后续视图更改(在第一个NgaAfterContentChecked()之后调用一次)。像下面这样 子组件 @Component({ selector: "academicyear-detail",
@Component({
selector: "academicyear-detail",
})
export class AcademicYearDetail {
currentYear: string;
ngOnInit() {
//do a rest call
//assign when data arrives
currentYear = data.currentAcademicYear;
}
}
@Component({
selector: "testProject",
templateUrl: "app/partials/Main.html",
directives: [AcademicYearDetail]
})
export class AppComponent {
@ViewChild(AcademicYearDetail) acadYearDetail:AcademicYearDetail;
ngAfterViewInit() {
this.getChildProperty();
}
getChildProperty() {
console.log(this.acadYearDetail.currentYear);
}
}
父组件
@Component({
selector: "academicyear-detail",
})
export class AcademicYearDetail {
currentYear: string;
ngOnInit() {
//do a rest call
//assign when data arrives
currentYear = data.currentAcademicYear;
}
}
@Component({
selector: "testProject",
templateUrl: "app/partials/Main.html",
directives: [AcademicYearDetail]
})
export class AppComponent {
@ViewChild(AcademicYearDetail) acadYearDetail:AcademicYearDetail;
ngAfterViewInit() {
this.getChildProperty();
}
getChildProperty() {
console.log(this.acadYearDetail.currentYear);
}
}
现在的问题是
您应该在子组件上使用输出发射器
@Component({
selector: "academicyear-detail",
})
export class AcademicYearDetail {
@Ouput()
currentYear = new EventEmitter<string>();
currentYear: string;
ngOnInit() {
//do a rest call
//assign when data arrives
this.currentYear.emit(currentAcademicYear);
}
@组件({
选择器:“年度详细信息”,
})
导出类详细信息{
@输出()
currentYear=新的EventEmitter();
本年度:字符串;
恩戈尼尼特(){
//打个休息电话
//数据到达时分配
本.currentYear.emit(currentYear);
}
然后在父组件的模板中设置变量
<academicyear-detail (currentYear)="acadYearDetail.currentYear = $event"></academicyear-detail>
您应该在子组件上使用输出发射器
@Component({
selector: "academicyear-detail",
})
export class AcademicYearDetail {
@Ouput()
currentYear = new EventEmitter<string>();
currentYear: string;
ngOnInit() {
//do a rest call
//assign when data arrives
this.currentYear.emit(currentAcademicYear);
}
@组件({
选择器:“年度详细信息”,
})
导出类详细信息{
@输出()
currentYear=新的EventEmitter();
本年度:字符串;
恩戈尼尼特(){
//打个休息电话
//数据到达时分配
本.currentYear.emit(currentYear);
}
然后在父组件的模板中设置变量
<academicyear-detail (currentYear)="acadYearDetail.currentYear = $event"></academicyear-detail>
如果让父组件获取数据的超集,您可能会更轻松地完成此操作。
主详细信息
模式本质上意味着子组件只接收它所需的数据,父组件可以缓存您的完整数据集,直到您需要它为止
要做到这一点,你可以在你的父母那里打剩余的电话
@Component({
selector: "testProject",
templateUrl: "app/partials/Main.html",
directives: [AcademicYearDetail]
})
export class AppComponent {
constructor(private http: HttpClient) { }
ngOnInit() {
//do a get for everything
}
}
在子组件中,您只需要绑定
@Component({
selector: "academicyear-detail",
})
export class AcademicYearDetail {
currentYear: string;
@Input() data;
ngOnChanges() {
//bind data to be used where ever in child.
}
如果让父组件获取数据的超集,您可能会更容易地完成此操作。
Master Detail
模式本质上意味着子组件只接收它所需的数据,父组件可以缓存您的完整数据集,直到您需要它为止
要做到这一点,你可以在你的父母那里打剩余的电话
@Component({
selector: "testProject",
templateUrl: "app/partials/Main.html",
directives: [AcademicYearDetail]
})
export class AppComponent {
constructor(private http: HttpClient) { }
ngOnInit() {
//do a get for everything
}
}
在子组件中,您只需要绑定
@Component({
selector: "academicyear-detail",
})
export class AcademicYearDetail {
currentYear: string;
@Input() data;
ngOnChanges() {
//bind data to be used where ever in child.
}
您应该将类似api调用的逻辑移动到服务中,并使用
rxjs/Subject
或rxjs/BehaviorSubject
将结果数据存储在其中
或者,如果您想进一步将数据存储在redux存储中,如以及,由于数据不可变和的使用,这对性能有很大的好处。此外,您的应用程序状态在任何时间点都是明确的,这可以减少副作用并提高可测试性
这将使您的逻辑远离组件,并且该服务可以在任何需要共享数据的组件中使用
有关共享应用程序数据的服务的更多信息,请参见的教程部分。您应该将类似api调用的逻辑移动到服务中,并使用
rxjs/Subject
或rxjs/BehaviorSubject
将生成的数据存储在其中
或者,如果您想进一步将数据存储在redux存储中,如以及,由于数据不可变和的使用,这对性能有很大的好处。此外,您的应用程序状态在任何时间点都是明确的,这可以减少副作用并提高可测试性
这将使您的逻辑远离组件,并且该服务可以在任何需要共享数据的组件中使用
有关共享应用程序数据的服务的更多信息,请参阅的教程部分。谢谢,但通过这种方式,我们必须在每个父对象中获取该子对象所属的数据。如果子对象对父对象是多对多的,则可以将其集中到具有行为子对象的服务中,因此数据状态始终是单例的……谢谢,但采用这种方式我们必须在每个父对象中获取该子对象所属的数据,如果子对象对父对象是多对多的,您可以将其集中到具有行为子对象的服务中,以便数据状态始终为单态。。。