Тема angular 6 не улавливает событие подписки?

Я создал компонент, содержащий загрузчик:

@Component({
  selector: 'app-loader',
  templateUrl: './loader.component.html',
  styleUrls: ['./loader.component.scss'],
  providers: [LoaderService]
})
export class LoaderComponent implements OnInit {

  showloader: boolean = false;

  constructor  (private loader_service:LoaderService) {}

  ngOnInit () {
    this.loader_service.showLoaderEventChange.subscribe(state => {
      console.log(state); // Nothing prints !!
       this.showloader = state;
    })
  }
}

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

public grabJsonData (enviroment: string, language: string) {
  this.loader_service.showLoader(true);
}

Он использует LoaderService:

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

  showLoaderEventChange = new Subject<any>();

  constructor() { }

  showLoader(state){
    this.showLoaderEventChange.next(state);
  }

}

Компонент загрузчика использует LoaderService, прослушивает showLoaderEventChange, чтобы передать next().

Но когда я делаю this.showLoaderEventChange.next(state), он ничего не ловит в функции subscribe.

Я что-то пропустил?

Вы уверены, что используете экземпляр службы тем же для обоих компонентов?

Sarthak Aggarwal 31.10.2018 12:21

Ну, это введено, так что я предполагаю, что это тот же статический вызов?

Ben Beri 31.10.2018 12:22

Попробуйте разместить LoaderService в поставщиках app.module.ts, чтобы убедиться, что один и тот же экземпляр используется во всем приложении, а не для внедрения отдельных компонентов.

Florian Bastianelli 31.10.2018 12:24
1
3
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это потому, что вы нет используете один и тот же экземпляр service для своих компонентов, поскольку вы вводите его как в root, так и в Loader Component.

Попробуйте удалить Providers : [LoaderService] с вашего Loadercomponent.

Я не уверен насчет Angular 6, так как я еще не тестировал его, но в Angular 5 вам нужно создать наблюдаемое, чтобы наблюдать за ним из вашего Subject как такового:

showLoaderEventChangeEmitter = new Subject<any>(); showLoaderEventChangeEvent$ = this.showLoaderEventChangeEmitter.asObservable();

Затем используйте showLoaderEventChangeEmitter.next(); для запуска событий и прослушивания их с помощью showLoaderEventChangeEvent$.subscribe().

Другие вопросы по теме