我有一個動態的 ng-select 控制元件陣列。每個控制元件由類NgSelectComponent表示。
When select value changes I want to subscribe to all controls.
模板
<ng-select #select">
<ng-option *ngFor="let option of options" [value]="select.id">{{ option.name }}</ng-option>
</ng-select>
班級
@ViewChildren('select') controls: QueryList<NgSelectComponent>;
ngAfterViewInit() {
concat(this.controls.toArray()).subscribe(x => {
console.log(x);
});
}
我嘗試這樣做,但不起作用。
concat(this.components.toArray()).subscribe(x => {
console.log(x);
});
我相信它不起作用,因為我必須訂閱changeEvent對應的每個控制元件產生的值,但努力做到這一點。
任何想法如何解決?
uj5u.com熱心網友回復:
首先,concat可能行不通。使用concat,陣列中的每個 observable 都將等待前一個完成。這可能不是您在這里所期望的行為。
您可以使用merge它將所有發出的值單獨轉發到輸出 Observable。或者combineLatest,如果你想要一個包含所有當前值的陣列,只要有一個 Observable 發出,就使用它。
要將 的 轉換為valueChanges陣列controls,請使用map。
merge(
...this.controls.toArray().map(c => c.changeEvent.asObservable())
).subscribe(x => {
console.log(x);
});
uj5u.com熱心網友回復:
這就是回應式表單的用途。您創建 aFormArray并FormControl在其中包含 s。然后你可以訂閱 s 的valueChangesobservable FormControl。我強烈建議您使用此角度功能重寫代碼。
話雖這么說,最簡單,更可以說未完善的解決方案是使用您所說的 changeEvent :
<ng-select #select (change)="selectChanged($event)">
<ng-option *ngFor="let option of options" [value]="select.id">{{ option.name }}</ng-option>
</ng-select>
selectChanged($event) {
// This function is called every time any select is changed.
// If you want, you can create a Subject and .next() the values there to have an Observable
console.log($event.target.value);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/526157.html
