Angular 5 - 如何在不刷新页面的情况下观看兄弟组件之间的数据更改?

时间:2018-03-05 09:46:38

标签: angular

我有两个兄弟组件,第一个组件有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);
    });
  }

2 个答案:

答案 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}}