让我们说:
以“Angular2方式”解决问题的最佳方式是ReplaySubject
Delegation: EventEmitter or Observable in Angular2。
我们必须订阅房间更改ChatService.rooms.subscribe(...
,订阅邮件更改,然后取消订阅所有内容......
在跨组件的服务中使用普通数组[]
并且创建新的房间/消息只是为了将该数据推送到数组中时,这不是更好吗?
或许我做错了什么。
export class ChatService {
private _rooms: ReplaySubject<Room[]> = new ReplaySubject(1);
rooms: Observable<Room []> = this._rooms.asObservable();
private socket;
private _selectedRoom: ReplaySubject<Room> = new ReplaySubject(1);
selectedRoom: Observable<Room> = this._selectedRoom.asObservable();
constructor(private UserService:UserService) {
this.socket = io.connect(window.location.origin, {
'query': 'token=' + UserService.token
});
this.socket.on('existingRooms', (data) => {
this._rooms.next(data.rooms);
});
}
createNewRoom(string: string) {
this.socket.emit('createNewRoom', {name: string});
this.socket.on('newRoomCreated', (data) => {
this._rooms.first().subscribe((rooms)=> {
rooms.unshift(data)
this._rooms.next(rooms);
}, err => console.error);
});
}
我无法使用BehaviorSubject
,因为我没有初始值;
我每次都要调用.first()
来获取ReplaySubject的当前值。
我必须订阅/取消订阅每个组件以避免内存泄漏。