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

1

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

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

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

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

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

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

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

Если я просто включу класс как переменную, он тоже не работает.

Мой filterComponent: я могу успешно вызвать свою службу внутри конструктора (engagementService, и я получаю доступ к массиву оттуда - this.engagementService.orgSubSidNames.

  @Injectable()
  export class EngagementFilterComponent implements OnInit {
  public subsidiaryForm: FormGroup;
  public subsidiaryOptions: Array<RadioButtonGroupOptions>;
   public orgSubSidNames = [];

  @Output() updateSubSids = new EventEmitter;

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

  ngOnInit(): void {

    this.subsidiaryForm = this.builder.group({ subsidiary: new FormControl() });
    this.subsidiaryForm.valueChanges.subscribe(data => this.updateSub(data.subsidiary, resolve));

  namesAsOrgs({ includeOpportunities, orgSubSidNames }) {
    return orgSubSidNames.map((name, i) => {
      return {
        label: name,
        value: '${i}',
        selected: this.includeOpportunities
      }
    })
  }

  subSidNamesToRadioButton() {
    console.log('we are calling here within the subsidnamesto radio button ')
    const subSids = this.namesAsOrgs({
      includeOpportunities: true,
      orgSubSidNames: this.engagementService.orgSubSidNames
    })

    this.subsidiaryOptions = subSids;
  }

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

Getordsubsubs создать массив имен, который затем сохраняется в 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 вызывается при первой загрузке системы.

  • 0
    Если я правильно понимаю ваш вопрос, вы пытаетесь добавить EngagementFilterComponent компонент в вашей EngagementService службы. И это не работает, я прав?
  • 0
    Да! Извините, если это было неоднозначно
Показать ещё 3 комментария
Теги:
angular

1 ответ

2
Лучший ответ

То, что вы сейчас делаете, невозможно. Вы не можете вводить компонент внутри конструктора 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
       }
   })
}
  • 0
    Это больше похоже на то, что мне действительно нужно, поэтому, в основном, только после получения данных, ТО вызывайте мою функцию - фактически вызывая ее из файла моего компонента, хотя, как я бы предпочел!
  • 1
    Да, это обходной путь, которому нужно следовать. Косвенный вызов метода component из самого компонента, но только когда служба информирует об этом через BehaviorSubject
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню