【问题标题】:RxJS ReplaySubject not updating Angular ZoneRxJS ReplaySubject 没有更新 Angular Zone
【发布时间】:2019-05-07 07:10:21
【问题描述】:

我有一个 ReplaySubject 变量正在服务上更新,并且组件正确获取新值,但它似乎没有更新视图(HTML 中的绑定保持为空,即使变量已正确更新)。

服务:

export class ExampleService {
  myVariable;

  constructor(private http: HttpClient, private userModel: UserModel) { 
    this.myVariable = new ReplaySubject(1);

    this.getApiRoot(`/api/endpoint`)
    .subscribe(
      data => { 
        this.myVariable.next(data);
      },
      err => { 
        console.log(`Database connection error: ${err}`);
      },
      () => { }
    );
  }
}

组件:

从 './example.service' 导入 { ExampleService }; 导出类 myComponent 实现 OnInit {

valueOnFrontend: string;

constructor(exampleService: ExampleService) {};

ngOnInit() {
    this.exampleService.myVariable.subscribe(
    function(value) {
        console.log(this.valueOnFrontend);
        this.valueOnFrontend = value;
    },
    function(error) {
        console.log(err);
    },
    function() {
        console.log("Request completed.");
    }

) } }

ExampleService 的 HTML 如下:

{{ valueOnFrontend }}

所以该值在服务中被正确更新,然后它被正确地发送到组件,组件中的console.log 记录了新值,但是 HTML 绑定没有得到更新。

我读到 RxJS 在它自己的 Zone 中运行,Angular Zone 不知道其中的更新。我该如何解决这个问题,并在 HTML 中获取要更新的值?

谢谢。 :P

【问题讨论】:

  • " this.valueOnFrontend = value;"这是组件对象的引用吗?
  • @ABOS 是的,没错。就是前端变量的值。
  • 显然不是,正如您在下面回答的那样。始终注意回调中“this”的范围。
  • 啊,我的印象是我引用了正确的变量,但范围是错误的。现在我明白你的问题了。干杯。

标签: angular rxjs


【解决方案1】:

您是否可以选择通过模板中的异步管道访问可观察的exampleService.myVariable 而无需订阅后面的代码?喜欢:

{{exampleService?.myVariable | async}}

【讨论】:

    【解决方案2】:

    组件中的订阅回调应该使用粗箭头来表示正确的范围

    this.exampleService.myVariable.subscribe( 
      (value: any) => { 
        console.log(this.valueOnFrontend);
        this.valueOnFrontend = value; 
      }, 
      (error: any) => { 
        console.log(err); 
      }, () => { 
        console.log("Request completed."); 
      }
    );
    

    【讨论】:

    • 它对你有用吗?如果不使用组件元数据更新您的问题
    • :O 成功了。我什至没有考虑 JavaScript 作用域,而是阅读了很多关于区域和东西的内容。干杯:)
    • 除非你不改变 changedetection 的策略,也就是 ZoneJS 默认的 cd 检查组件发生
    • 知道了。感谢您的解释和帮助:)
    • np!很高兴它有帮助!
    猜你喜欢
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多