BehaviorSubject:next不是函数

问题描述 投票:5回答:1

我正在尝试在兄弟组件之间共享数据,并通过共享服务执行此操作。加载第一个组件时,它会从我的API中检索一个服务器列表,并用所有检索到的服务器填充一个选择框。现在我想在用户选择新服务器时通知我的其他组件,以便我可以显示它的详细信息。

这是我的服务:

@Injectable()
export class DashboardService {
    servers: Server[] = [];
    selectedServer = new BehaviorSubject<Server>(null);

    setServers(servers: Server[]) {
        this.servers = servers;
    }

}

带选择框的组件:

@Component({
  selector: 'app-servers-select',
  template: `
    <div class="form-group">
      <label>Server</label>
      <select class="form-control" [(ngModel)]="this.dashboardService.selectedServer" (ngModelChange)="change($event)">
        <option disabled>-- Select server --</option>
        <option *ngFor="let server of servers" [ngValue]="server">{{server.Name}}</option>
      </select>
    </div>`,
  styleUrls: ['./servers-select.component.css'],
  providers: [ServerService]
})
export class ServersSelectComponent implements OnInit {
  servers: Server[] = [];

  constructor(private serverService: ServerService, private dashboardService: DashboardService) { }
  ngOnInit() {
    this.serverService
      .getServers()
      .subscribe(s => {
        this.servers = s;
        this.dashboardService.setServers(s);
        console.log(s);
      },
      e => console.log(e));

  }

  // todo: pass to dashboard component
  public change = (event: any) => {
    console.log(event);
    this.dashboardService.selectedServer.next(event);
  }

}

细节组件:

@Component({
  selector: 'app-server-details',
  template: `
  <section>
  <div class="form-group">
    <label>Description</label>
    <input type="text" [(ngModel)]="server">
  </div>
</section>
  `,
  styleUrls: ['./server-details.component.css']
})
export class ServerDetailsComponent implements OnInit {

  private server: Server = null;

  constructor(private dashboardService: DashboardService) { }

  ngOnInit() {
    this.dashboardService.selectedServer.subscribe((value: Server) => {
      console.log(value + 'lalalal');
      this.server = value;
    });
  }

}

当我选择一个新的服务器时,会正确调用change()方法,但会在控制台中抛出以下错误:

错误TypeError:_this.dashboardService.selectedServer.next不是ServersSelectComponent.change中的函数(servers-select.component.ts:39)

订阅似乎已经工作,因为我在我的控制台中得到'nulllalalal'。我错过了什么?

编辑: - 我使用角度5和rxjs 5.5.2 - 在我的DashboardService中,我导入BehaviorSubject如下:

import { BehaviorSubject } from 'rxjs/BehaviorSubject';
javascript angular typescript rxjs rxjs5
1个回答
6
投票

ServersSelectComponent的模板中,您有:

[(ngModel)]="this.dashboardService.selectedServer"

这将使用其中一个选项的值覆盖selectedServer服务属性。

如果你想通过RxJS主题发出更改,你肯定不想使用[(ngModel)]并使用(change)(change)="change($event)"事件监听器手动触发更改。

© www.soinside.com 2019 - 2024. All rights reserved.