我有两个兄弟组件,第一个组件有select
框,不同option
绑定到名为selectedValue
的变量。当我更改第一个组件中的选项值时,我希望在第二个组件中更改相同的值。但是,第二个组件仍然显示未定义的值。这两个兄弟组件同时具有ngOnInit
。
这是我的代码:
component1.ts:
selectedValue: any;
tokens: Tokens;
constructor(
private apiService: ApiService,
private sharedService: SharedService
) {
}
ngOnInit() {
this.loadTokens();
this.sharedService.pair.next(this.selectedValue);
}
loadTokens() {
this.apiService.getTokens()
.subscribe((data: any) => {
this.tokens = data;
}, error => {
console.log(error);
});
}
component1.html:
<mat-select placeholder="Choose a pair" [(ngModel)]="selectedValue">
<mat-option>-- None --</mat-option>
<mat-option *ngFor="let token of tokens" [value]="token.shortName">
{{token.name}}
</mat-option>
</mat-select>
shared.service.ts:
@Injectable()
export class SharedService {
pair = new BehaviorSubject(null);
observable: Observable<any> = this.pair.asObservable();
}
component2.ts:
pair: any;
constructor(private sharedService: SharedService) {}
ngOnInit() {
this.sharedService.observable.subscribe((data) => {
this.pair = data;
console.log(this.pair);
});
}
答案 0 :(得分:3)
问题是您在设置值之前调用.next
。你应该做的是:
<mat-select placeholder="Choose a pair" [(ngModel)]="selectedValue" (ngModelChange)="emit($event)"></mat-select>
emit(selectedValue) {
this.sharedService.pair.next(selectedValue);
}
答案 1 :(得分:1)
您应该为每次更改分配新的selectedValue
值。
例如
component1.html:
<mat-select placeholder="Choose a pair"
(ngModelChange)="this.sharedService.pair.next($event);"
[(ngModel)]="selectedValue">
<mat-option>-- None --</mat-option>
<mat-option *ngFor="let token of tokens" [value]="token.shortName">
{{token.name}}
</mat-option>
</mat-select>
或者,代替可观察对象,在服务上创建字段pair: string
并将其绑定到ngModel
。
COMPONENT1:
[(ngModel)]="sharedService.pair"
COMPONENT2:
{{sharedService.pair}}