我正在尝试在兄弟组件之间共享数据,并通过共享服务执行此操作。加载第一个组件时,它会从我的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';
答案 0 :(得分:6)
在ServersSelectComponent
的模板中,您有:
[(ngModel)]="this.dashboardService.selectedServer"
这会使用其中一个选项覆盖selectedServer
服务属性。
如果您想通过RxJS主题发出更改,您绝对不想使用[(ngModel)]
并使用(change)
事件监听器({1}}手动触发更改。< / p>