Angular 5+ RxJS Подписка на тему не работает - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть служба, у которой есть наблюдаемая, на которую подписан. Полезная нагрузка передается на предмет в сервисе. Однако, когда я подписываюсь на тему в моем компоненте, ничего не происходит. Я должен видеть console.log в методе .subscribe в ngOnInit в компоненте.

У меня была такая же настройка, работающая с предыдущей версией, которая подписалась на наблюдаемую в результате операции http.get. Я хочу знать, почему он не работает с этой версией.

Услуга:

@Injectable()
export class TileService {

  availableTiles$ = new Subject<any>();

  // The view is expecing an array, else: Error trying to diff '[object Object]'. Only arrays and iterables are allowed
  source: {}[] = [
    {title: 'Title A'},
    {title: 'Title B'}
  ];

  simpleObservable = new Observable((observer) => {
    observer.next(this.source);
    observer.complete();
});

  constructor() { }

  getTiles(): void {
    this.simpleObservable.subscribe(x => this.availableTilesStream(x));
  }

  availableTilesStream(data) {
    console.log(data);                // Logs an array of the two objects from the source array
    this.availableTiles$.next(data);  // Nothing seems to happen here.
   }

}

Component.ts:

@Component({
  selector: 'app-available-tiles',
  templateUrl: './available-tiles.component.html',
  styleUrls: ['./available-tiles.component.css']
})
export class AvailableTilesComponent implements OnInit {

  tiles: {}[];

  constructor(private tileService: TileService) { }

  ngOnInit() {
    this.tileService.getTiles();
    this.tileService.availableTiles$.subscribe(x => {
      console.log('Log from availableTiles$.subscribe in ngOnInit: ', x);
      this.tiles = x;
    });
  }

}

1 Ответ

0 голосов
/ 25 апреля 2018

Как сказал Ринго, компонент, скорее всего, подписывается после передачи данных (через .next ()) в доступный объект $ Subject.

Поскольку вы используете тему, поздние подписчики не получат значение, пока не будет вызван .next () для исходного объекта снова.

Одним из решений является использование BehaviorSubject.Это означает, что любой подписчик (включая поздних) сразу получит значение.

@Injectable()
export class TileService {

   availableTiles$ = new BehaviorSubject<any>([]); // must be initialised with a value
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...