Как инициализировать угловой сервис, используя модель? - PullRequest
1 голос
/ 21 июня 2019

Я создал угловой сервис, который будет использоваться всеми моими компонентами «Задача» для потоковой передачи данных с использованием 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)

1 Ответ

0 голосов
/ 21 июня 2019

После некоторых размышлений вы можете захотеть использовать репозиторий, который может использовать фабрику, а может и не использовать

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