![](/img/trans.png)
[英]How to pass data from Child to Parent, if Child component dynamic component
[英]How to pass data to child component's @Input from Observable
我有一個 angular 組件,用作 html 頁面上 for 循環中的選項卡:
...
<ng-container *ngFor="let tabData of data$ | async;">
<tab-component
id="{{ tabData.id }}"
name="{{ tabData.name }}"
>
</tab-component>
</ng-container>
<child-component [selectedData]="selectedData"></child-component>
在 .ts 文件中:
public data$: Observable<Data[]>
public selectedData: Data
ngOnInit() {
this.data$ = this.service.getAllData();
}
ngAfterContentInit() {
this.data$.subscribe(items => this.selectedData = items[0])
}
我希望第一個選項卡在第一次加載頁面(數組中的元素 0)時默認始終是 selectedData。 然后單擊或右/左箭頭鍵,動態更新傳遞給子組件的 selectedData 的值。 到目前為止,我已經嘗試了所有方法,並且子組件中 selectedData 的值始終未定義
請幫助我,我怎樣才能做到這一點!
ngOnInIt
本身中訂閱 allData 並在分配它之前檢查items
的值 - 無論你是否得到它,如果你無法在那里找到值,那么getAllDataService
一定有問題。<child-component [selectedTab]="selectedTab"></child-component>
希望這可以幫助!
您在模板 HTML 文件中究竟在哪里使用selectedData
?
在您提供的片段中,使用了一個selectedTab
,但在任何地方都沒有selectedData
...
<ng-container *ngFor="let tabData of data$ | async;">
<tab-component
id="{{ tabData.id }}"
name="{{ tabData.name }}"
>
</tab-component>
</ng-container>
<child-component [selectedTab]=selectedTab></child-component>
此外,您可以遵循@Eugene 的建議並執行以下操作:
ngOnInit() {
this.data$ = this.service.getAllData().pipe(
tap((items) => this.selectedData = items[0])
);
}
不使用ngAfterContentInit()
並且需要第二次訂閱。
您可以使用主題來表達當前選擇的選項卡數據,然后使用combineLatest
創建兩個來源的 observable。
private data$: Observable<Data[]> = this.service.getAllData();
private selectedData$ = new BehaviorSubject<Data>(undefined);
vm$ = combineLatest([this.data$, this.selectedData$]).pipe(
map(([tabData, selected]) => ({
tabData,
selectedTab: selected ?? tabData[0]
})
);
setSelected(data: Data) {
this.selectedData$.next(data);
}
在這里,我們使用combineLatest
創建視圖可以使用的單個 observable(視圖 model )。 每當它的任何一個源發出時,這個 observable 都會發出。
我們將selectedData$
BehaviorSubject
設置為發出undefined
的初始值。 然后,在 map 內部,我們將selectedTab
屬性設置為在尚未設置選擇時使用tabData[0]
。 因此,最初,它將使用tabData[0]
,但在setSelected()
之后,它將使用該值。
<ng-container *ngIf="let vm$ | async as vm">
<tab-component *ngFor="let tabData of vm.tabData"
[id] = "tabData.id"
[name] = "tabData.name"
(click) = "setSelected(tabData)">
</tab-component>
<child-component [selectedTab]="vm.selectedTab"></child-component>
</ng-container>
我設法得到它,以便在子端傳遞的值不再使用 ngIf 未定義,所以:
<child-component *ngIf=selectedData [selectedData]="selectedData"></child-component>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.