我已经创建了一个角度服务,所有“任务”组件都将使用它来使用socket.io
来流数据:
@Injectable()
export class ChartService {
private socket: SocketIOClient.Socket;
constructor(task: Task) {
this.socket = io(`${environment.api_url}tasks/${task.id}/data/socket`);
}
// HANDLER
onNewMessage() {
return Observable.create(observer => {
this.socket.on('newMessage', msg => {
observer.next(msg);
});
});
}
}
如何从任务组件中调用服务? 现在,我称该服务为follwing:
export class TaskPreviewComponent implements OnInit {
@Input() task: Task;
constructor(
private tasksService: TasksService,
private chartService: ChartService
){}
...
但是我不知道我是否允许使用一些特定的数据来初始化服务。我的想法是使用数据来调用服务,例如
private chartService: ChartService(task)
答案 0 :(得分:0)
经过进一步思考,您可能想使用可能会或可能不会使用工厂底层的存储库
@Injectable()
export class ChartServiceRepository {
private services: { [key: string]: ChartService } = {};
public get(task: Task) {
if (!this.services[task.id]) { // same instance for every request
this.services[task.id] = new ChartService(task); // if some additional injections are required you can use angular injector here (factory part)
}
return this.services[task.id];
}
}
然后您像这样使用它:
export class TaskPreviewComponent implements OnInit {
@Input() task: Task;
constructor(
...
private chartServiceRepository: ChartServiceRepository
){}
以及代码中的其他地方
const chartService = this.chartServiceRepository.get(this.task);
chartService.onNewMessage();