подписка на тему поведения не работает на всех компонентах - PullRequest
0 голосов
/ 27 июня 2019

В моем глобальном сервисе я настраиваю переменную поведенческого объекта

dataWorkFlowService :

export class CallWorkflowService {
  url = 'http://localhost:3000/';
  selectedNode : BehaviorSubject<Node> = new BehaviorSubject(new Node(''))
  dataflow : BehaviorSubject<any> = new BehaviorSubject<any>({});

  constructor(private http: HttpClient) {}
  getDataflow() {
    return this.http.get(this.url);
  }
  updateNode(node :Node) {
    this.selectedNode.next(node);
  }
}

В моем компоненте ReteComponent Я устанавливаю значение поведения с помощью

this.dataFlowService.selectedNode.next(node);

Я - мой второй компонент. Я подписываюсь на BehaviourSubject

export class ComponentsMenuComponent implements OnInit {

constructor(private callWorkflowService:CallWorkflowService) { }
selectedNode:Node = new Node('');
dataFlow:any;
nxtElements:String[]=[]

ngOnInit() {


    this.callWorkflowService.dataflow.subscribe(data=> {
      this.dataFlow=data
    })
    this.callWorkflowService.selectedNode.subscribe( (node) => {
      this.selectedNode=node; <=== ###### Subscription is not triggered
      if(this.dataFlow) {
        this.nxtElements=this.dataFlow[node.name].next;
      }

    })
  }

Когда я запускаю новое значение для selectedNode, моя подписка не работает

Но в другом компоненте он работает хорошо

export class AppComponent {
  opened:boolean=false;
  events: string[] = [];
  constructor(private callWorkflowService:CallWorkflowService) { }

  ngOnInit() {
    this.callWorkflowService.selectedNode.pipe(
      skip(1)
    )
    .subscribe( (node) => {
      this.opened=true; <== subscription is working
    })
  }
}

Я заметил, что в ComponentsMenuComponent , когда я изменяю его на

export class ComponentsMenuComponent implements OnInit {

constructor(private callWorkflowService:CallWorkflowService) { }
selectedNode:Node = new Node('');
dataFlow:any;
nxtElements:String[]=[]

ngOnInit() {
     this.callWorkflowService.getDataflow().subscribe(data=> {
       this.dataFlow=data;
     }) ####CHANGE HERE ### <== using `getDataFlow` method which is not observable
    this.callWorkflowService.selectedNode.subscribe( (node) => {
      this.selectedNode=node; ### <=== subscription is triggered
      if(this.dataFlow) {
        this.nxtElements=this.dataFlow[node.name].next;
      }

    })
  }

, подписка selectNodeработает.

Обновление Я пытался изменить порядок действий

В своем сервисе я добавил метод, который возвращает последнее значение

updateDataFlow() {
  return this.dataflow.getValue();
}

В ComponentsMenuComponent

this.callWorkflowService.node.subscribe( (node) => {
  this.dataFlow = this.callWorkflowService.updateDataFlow();
  this.selectedNode=node;
  if(this.dataFlow) {
    this.nxtElements=this.dataFlow[node.name].next;
  }

})

Здесь снова подписка не работает ..

Я попытался прокомментировать строку

this.dataFlow = this.callWorkflowService.updateDataFlow(); И вот сюрприз.. подписка работает.

Я не знаю, почему она не подписываетсякогда я раскомментирую строку, которую я упомянул

1 Ответ

0 голосов
/ 28 июня 2019

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

Как вы предоставляете услугу? Это предусмотрено в модуле, компоненте, или вы используете в?

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