angular - 如何使用模型初始化角度服务?
问题描述
我创建了一个角度服务,我的所有“任务”组件都将使用它来流式传输数据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);
});
});
}
}
如何从任务组件调用服务?现在,我将服务称为以下内容:
export class TaskPreviewComponent implements OnInit {
@Input() task: Task;
constructor(
private tasksService: TasksService,
private chartService: ChartService
){}
...
但我不知道我是否允许使用某些特定数据初始化服务。我的想法是用数据调用服务,例如
private chartService: ChartService(task)
解决方案
经过更多思考后,您可能想要使用可能使用或不使用工厂底层的存储库
@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();
推荐阅读
- php - 多种功能和页面以及存储它们以提高性能的适当方法
- java - 获取数据库表的触发器名称
- android - Cordova File-Transfer-plugin 下载文件:错误代码 2
- mysql - 为什么我的本地 mysql 实例保存的时间与我的实时实例不同?
- angular - 如何在 Angular 7 的数据透视表(Syncfusion 框架)中显示 0?
- macos - gpg“未能写入提交对象”
- java - 我在使用spring mvc和retrofit 2.0将文件上传到服务器时遇到了这个问题
- opc-ua - 如何使用 Eclipse Milo OPC Server 发送数据
- vue.js - 遍历 Vuex 存储对象
- sql - 计数为零时未显示 PostgreSQL 行