【问题标题】:RxJS Observable not triggering on change in Angular MaterialRxJS Observable 不会触发 Angular Material 的变化
【发布时间】:2019-12-02 06:50:08
【问题描述】:

我正在尝试在我创建的服务连接到他的服务器后立即执行一项操作。目前我只是保存一个connected: boolean,它会改变连接和连接丢失的状态,并将其作为可观察对象返回。

通过订阅,我只能检索 observable 的初始状态。当布尔值更改其值(它确实如此)时,订阅不会触发。

感谢任何帮助。

app.component.ts(订阅)

ngOnInit() {
    this.moduleService.isConnected().subscribe(value => console.log(value)); 
  }

module.service.ts(在组件中注入)

isConnected(): Observable<boolean> {
    return of(this._mqttApi.isConnected());
  }

mqttApi.ts(此处为布尔值更改)

connected: boolean = false;

onConnect(){
  connected = true;
}

onConnectionLost(){
  connected = false
}

public isConnected(): boolean{
  return this.connected;
}

【问题讨论】:

    标签: angular rxjs observable subscription


    【解决方案1】:

    在您的 module.service.ts 中,您只返回一个使用 of 只发出一次的可观察对象。您需要的是 BehaviorSubject 或 Subject 作为连接属性的类型,而不是 mqttApi.ts 中的布尔值

    然后,如果您不希望服务使用此 observable 更改主题,请使用 connected.asObservable() 将该 observable 公开。否则,您也可以公开主题/行为主题。

    在你的方法里面你调用connected.next(true|false)

    类似这样的:

    connected: BehaviorSubject<boolean> = new BehaviorSubject(false);
    
    onConnect(){
      this.connected.next(true);
    }
    
    onConnectionLost(){
      this.connected.next(false)
    }
    
    public isConnected(): Observable<boolean>{
      return this.connected.asObservable();
    }
    

    【讨论】:

    • 这成功了!谢谢。您能否进一步详细说明为什么of() 不起作用?我使用了of(),因为它在“英雄之旅”中起作用,他们或多或少地做同样的事情,但使用数组而不是布尔值。
    • 查看官方文档:learnrxjs.io/operators/creation/of.htmlof 发出给定值的数量,然后完成。这意味着如果你只传入一个元素,它只会发出那个元素然后完成。如果您传递一个包含 3 个元素的数组,它只会发出这三个元素,然后完成。这不是您需要的持续数据流。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-11
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    相关资源
    最近更新 更多