подписка в файле app.component работает только один раз (не работает дважды)? - PullRequest
0 голосов
/ 07 мая 2020

У меня есть родительский класс, в котором есть метод. В этом методе у меня есть подписка.

код выглядит так:

 parentMethod(){
     this.token.subscribed(token=>{
     this.profile.next(token);
   });
 }

когда он запускает this.profile.next(), он не будет go в подписке профиля, который находится в app.component.ts (детский класс). Хотя он попадает туда один раз, когда приложение загружается.

цикл кода, как в app.component.ts :

 freshToken(){  //being called from constructor of app.component.ts
    this.profile.subscribe(
    (val)=>{
    console.log("Firing once");
   });
  }

, и я использую тем .

кто-нибудь может мне сказать, почему он не срабатывает каждый раз? и как заставить его срабатывать каждый раз?

Ответы [ 2 ]

2 голосов
/ 07 мая 2020

Вы можете использовать для этого сервис:

@Injectable({
    providedIn: 'root',
})
export class YourService {

    private yourVariable: Subject<any> = new Subject<any>();


    public listenYourVariable() {
        return this.yourVariable.asObservable();

    }


    public yourVariableObserver(value ?: type) {
        this.yourVariable.next(value);
    }

Вы импортируете в свои компоненты, где хотите использовать эту услугу.

import{ YourService } from ...

В другом компоненте:

submit(){
    this.yourService.yourVariableObserver();
}

в компоненте приложения

gOnInit() {
   this.sub=this.yourService.listenYourVariable().subscribe(
            variable => {
              this.callyourFunction();
            }

        )
    }

Не забудьте отказаться от подписки, чтобы предотвратить утечку памяти

 ngOnDestroy() {
  this.sub.unsubscribe()
}
1 голос
/ 07 мая 2020

Вы должны создать метод publi sh, который генерирует событие, и метод получения, который отвечает за прослушивание события. Я о том, что вы создали и наблюдаете, в которые публикуете sh событий. В вашем случае this.profile.next (token) может быть вашим методом вывода. Метод получения должен быть внутри ловушки ngOnInit или конструктора.

Вот пример кода того, как это можно реализовать. Я создал файл data.service.ts, который содержит методы для генерации и приема событий

data.service.ts

export class DataService {
private profileSubject = new Subject<any>()

 constructor() {}

   getProfileSubject() {
    return this.profileSubject;

  }
  publishProfileSubject(data) {
    this.profileSubject.next(data);

  }

}

Вы можете вызвать этот метод когда вам нужно создать событие.

publishProfileSubject(data) {
  this.profileSubject.next(data);

  }

И вы можете вызвать этот метод, когда хотите прослушивать новые события. Как упоминалось ранее, в идеале вы должны инициализировать функцию внутри хука ex. ngOnInit и подпишитесь на функцию.

...