订阅行为主题不适用于所有组件

时间:2019-06-27 19:00:22

标签: javascript angular rxjs subscription behaviorsubject

我的全球服务人员会推动behaviourSubject变量

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 中,我使用

设置了behaviourSubject值

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 :(得分:0)

您必须错误地提供了CallWorkflowService,并且在不同的组件中获得了该服务的另一个实例。如果一个组件正常工作,而另一个组件却不工作,那么我猜他们不是都订阅了相同的行为主题。

您如何提供服务?是在模块,组件中提供的,还是在其中使用的?