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