Предмет, наблюдаемый на службе, не работает должным образом - PullRequest
1 голос
/ 01 октября 2019

У меня есть компонент A, который отправляет значение методу службы (посредством его вызова), а затем я попытался создать субъект и «наблюдать» его из компонента B, таким образом вызывая действие на компоненте B изкомпонент А. Это то, что я сделал:

Компонент A отправляет данные:

this.service.method(id_estado)

Чтополучено службой:

import { Injectable } from '@angular/core';
import { BehaviorSubject, of, Observable, Subscription, Subject  }    from 'rxjs';
export class service {
    estado: any;
    subject = new Subject<any>();
    constructor( private api: ApiService ) {
    } 
    service ( id_estado ){
        let subject = new Subject<any>();
        this.subject.next(estado)
    }
} 

И в компоненте B я пытаюсь наблюдать это так:

this.service.subject.subscribe( (data) => {
     console.log(data);
});

Компонент B имеет место внутри метода. Это причина проблемы? Я не могу получить данные для отображения на моем console.log

Ответы [ 3 ]

0 голосов
/ 01 октября 2019

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

0 голосов
/ 01 октября 2019

Компонент B имеет место внутри метода. Это причина проблемы?

Да, это проблема. Если этот метод не вызывается, значит, вы не подписываетесь на Subject, и поэтому данные не принимаются.

Переместите эту часть подписки в ngOnInit компонента B.

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

После этого изменения ваш сервис должен выглядеть следующим образом:

export class service {
    estado: any;
    subject = new Subject<any>();

    constructor( private api: ApiService ) {
    } 

    service(id_estado) {
      this.subject.next(estado);
    }
} 

Проверьте этот StackBlitz , где вы можете видеть компоненты, взаимодействующие в режиме реального времени с использованием Subject.

0 голосов
/ 01 октября 2019
let subject = new Subject<any>();
this.subject.next(estado)

- следует переместить в конструктор для инициализации.

или просто выполнить службу в конструкторе:

import { Injectable } from '@angular/core';
import { BehaviorSubject, of, Observable, Subscription, Subject  }    from 'rxjs';
export class service {
    estado: any;
    subject = new Subject<any>();
    constructor( private api: ApiService ) {
        service(true); // or some value you need.
    } 
    service (id_estado){
        this.subject.next(estado);
    }
} 

В этом случае вы можете удалить инициализацию subject = new Subject<any>(); перед конструктором.

В вашем случае вы только что получили Subject, но .next() не был выполнен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...