Вызов функции компонента из службы - возможная циклическая зависимость - угловая - PullRequest
0 голосов
/ 19 октября 2018

Я хочу иметь возможность вызывать функцию из моего filterComponent (компонента) внутри моего engagementService (службы)

Функция в моем filterComponent обращается к массиву, который находится в engagementService - он использует данные этого массивадобавить в переключатель в его HTML-шаблон.

Он успешно обращается к массиву, поскольку я включаю engagementService в конструктор filterComponents (я протестировал его с помощью функции щелчка, но функционально это не работает, так как мне нужно радиокнопка, чтобы иметь имена после загрузки).

Данные этого массива заполняются после загрузки моей главной страницы, поскольку данные извлекаются из конечной точки, которая находится в engagementService, поэтому я хочу вызывать эту функцию только после загрузки графика (асинхронно), функции графиканаходится в engagementService, а также в другом коде, где я мог бы эффективно вызывать эту функцию из моего filterComponent после заполнения массива данными, и, следовательно, он будет работать.

Я, вероятно, сделал это не лучшим образомтак как у меня есть массив в engagementService, который заполняется данными из конечной точки, а затем я хочу вызвать функцию из filterComponent в engagementService, который использует массив.

Таким образом, данные идут в одну сторону, но неДругой.У меня есть второй компонент, где я мог бы также вызвать функцию, так как я вызываю функцию графа внутри, но у меня тоже была такая же проблема.

Если я добавляю класс компонента в конструктор, я получаю 'Не удается разрешить все параметры для EngagementService: ([объект объекта],?).'

Если я просто включу класс какпеременная, с которой он не работает* Мой сервис: (если я включаю engagementFilter в конструктор или даже просто вызываю класс внутри класса, который система просто не загружает, и в конструкторе выдает ошибку «невозможно разрешить параметры объекта в конструкторе engagementService».

Getordsubsiaries создают массив имен, который затем сохраняется в orgSubSidNames, который вызывается в функции компонентов ... это работает! Но, конечно, мне нужно вызывать эту функцию асинхронно, так как имена извлекаются конечной точкой.

    @Injectable()
   export class EngagementService {
  public orgSubSidIds = [];
  public graphParams: IGraphParams = {

  }

  constructor(private http: WefHttp) {
    this.baseURL = `${environment.ews_api_host}/${ENDPOINTS.api}`;
    this.organization = this.focus = new EngagementRoot();
  }


  getOrgSubsidiaries(id) {
    return this.organizationSubsidiaries(id)
  .subscribe(data => {
    console.log('subsidiaries data' + JSON.stringify(data));

    let subsidiaryNames = []
    data.forEach(sub => {
      subsidiaryNames.push(sub.SubsidiaryName)
    })
    subsidiaryNames = subsidiaryNames.filter(this.onlyUnique);

    this.orgSubSidNames = subsidiaryNames;

  });
 }

Этот getOrgSubsidiaries является callредактируется при первой загрузке системы.

1 Ответ

0 голосов
/ 19 октября 2018

То, что вы сейчас делаете, невозможно.Вы не можете внедрить компонент внутри конструктора service или любого другого конструктора component's.Это не способ взять под контроль component.

Если вы действительно хотите вызвать метод компонента из службы, то вы можете использовать Subject или BehaviorSubject и затем подписаться на него из компонента.

service.ts

private _source = new BehaviorSubject<boolean>();
public source$ = this._source.asObservable();   // observable to be subscribed from the component

getOrgSubsidiaries(id) {
    return this.organizationSubsidiaries(id)
        .subscribe(data => {
            console.log('subsidiaries data' + JSON.stringify(data));

            ...........................
            this.orgSubSidNames = subsidiaryNames;

            //emit event
            this._source.next(true);
        });
}

component.ts

constructor(private builder: FormBuilder, public engagementService: EngagementService) { }

ngOnInit(){
   // subscribe to emitter(BehaviourSubject) of service
   this.engagementService.source$.subscribe(
   (data)=>{
       if(data){
           // call component method here every time when event is emitted
       }
   })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...