首页 > 解决方案 > 如何使用模型初始化角度服务?

问题描述

我创建了一个角度服务,我的所有“任务”组件都将使用它来流式传输数据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)

标签: angularangular-services

解决方案


经过更多思考后,您可能想要使用可能使用或不使用工厂底层的存储库

@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();

推荐阅读