【问题标题】:Service variable not updating in parent component while changing it in child component服务变量在子组件中更改时未在父组件中更新
【发布时间】:2021-03-30 06:08:32
【问题描述】:

我有一个角度应用程序,其中有一个服务具有 3 种类型的变量:简单布尔值、布尔类型的行为主体和具有数字类型属性的对象。

我正在使用服务的 getter-setter 方法从子组件更新所有 3 个变量。现在我想要父组件中服务变量的更新更改,而不会从子组件发出更改。它适用于 object 和 behaviorSubject,但并未反映简单布尔变量的变化。

那么,这三者之间有什么区别会导致这种行为?

我创建了一个简单的 stackblitz 演示来演示上述内容。这是链接:Stackblitz

【问题讨论】:

    标签: angular rxjs angular-services


    【解决方案1】:

    更简单地分解问题:

    let myBoolean = false;
    let newBoolean = myBoolean;
    newBoolean = true;
    console.log(newBoolean); //true
    console.log(myBoolean); //false
    

    let myBoolean = { data : false };
    let newBoolean = myBoolean;
    newBoolean.data = true;
    console.log(newBoolean); //true
    console.log(myBoolean); //true
    

    当分配原始值时,您是按值分配。更改此值不会影响原始值。当你对对象做同样的事情时,你仍然是按值传递(指向原始对象的指针),但是更改该对象的属性也会更改原始对象。 Javascript 有点奇怪,这里有一个关于 Stackoverflow 的更好解释:https://stackoverflow.com/a/6605700/177516

    现在在您的示例中,布尔值不起作用的原因是您在 appComponent 中分配它,因此克隆值和对原始值的任何更改都不会影响它。这不是 Angular 问题,而是 javascript 问题。

    例如,如果您在视图中进行了更改以执行类似的操作

    {{service.isValue}}
    

    然后这将实时更新,因为您指向的是原始参考,而不是您的克隆版本。

    【讨论】:

    • 非常感谢。有史以来最好的解释。 :)
    【解决方案2】:

    您的问题是 ngOnInit 订阅格式错误。看起来您的意图是更改这三个值。

    改变你现有的:

     ngOnInit() {
      this.service.isObservableValue
      // .pipe(take(1))
      .subscribe(bool => (this.isObservaleValue = bool)); // <-- only this gets called on subscribed event
    
     this.isValue = this.service.isValue; // <--- these two lines only get called once
     this.data = this.service.response.data; // <--- this too
    }
    

    到这里:

     ngOnInit() {
      this.service.isObservableValue
      // .pipe(take(1))
      .subscribe(bool => { // <-- add a bracket here
        this.isObservaleValue = bool;
        this.isValue = this.service.isValue;
        this.data = this.service.response.data;
      } // <-- and another one here.
      );
     }
    

    【讨论】:

    • 是的,没错。但是变量 this.data 正在更新而没有将其放入订阅中,并且 isValue 没有更新。
    猜你喜欢
    • 2017-11-03
    • 2021-06-12
    • 2018-06-09
    • 1970-01-01
    • 2021-06-30
    • 2019-07-28
    • 2017-04-17
    • 1970-01-01
    • 2019-07-13
    相关资源
    最近更新 更多