如何使用模型初始化角度服务?

时间:2019-06-21 20:19:59

标签: angular angular-services

我已经创建了一个角度服务,所有“任务”组件都将使用它来使用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)

1 个答案:

答案 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();