BehaviorSubject:next不是函数

时间:2017-12-20 09:36:27

标签: javascript angular typescript rxjs rxjs5

我正在尝试在兄弟组件之间共享数据,并通过共享服务执行此操作。加载第一个组件时,它会从我的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()方法,但会在控制台中抛出以下错误:

  

错误类型错误:_this.dashboardService.selectedServer.next不是函数       在ServersSelectComponent.change(servers-select.component.ts:39)

订阅似乎已经有效,因为我在我的控制台中获得了“nulllalalal”。我错过了什么?

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

import { BehaviorSubject } from 'rxjs/BehaviorSubject';

1 个答案:

答案 0 :(得分:6)

ServersSelectComponent的模板中,您有:

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

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

如果您想通过RxJS主题发出更改,您绝对不想使用[(ngModel)]并使用(change)事件监听器({1}}手动触发更改。< / p>