【问题标题】:Angular RxJs: Get last value from anyControl.valueChanges- similar to BehaviorSubjectAngular RxJs:从 anyControl.valueChanges 获取最后一个值 - 类似于 BehaviorSubject
【发布时间】:2020-11-10 10:35:14
【问题描述】:

我使用 valueChanges 来查看特定控件的更改。 当我将控制值设为@Input 并将其初始化为ngOnChanges 时,问题就开始了。 如果我使用async 管道观看它, 它不起作用。

我想,这是因为ngOnChanges 出现在ngOnInit 之前, 然后在初始启动后对 observable 进行“订阅”。 问题是如何解决这个问题。 valueChanges 可以充当 BehaviorSubject 吗? 或者有人有其他想法吗?

这是我的代码:

component.ts:

@Input() customerId;
customerState$: observable<number>;
myForm:FormGroup;

constructor(){
 this.customerState$= this.myForm.controls.customerId.valueChanges;
}

ngOnChanges(){
     if (changes.customerId) {
        this.myForm.controls.customerId.setValue(changes.customerId.currentValue);
      }
}

component.html:

{{customerState$|async}}

第一次,它什么也没显示。 只有在customeId 再次更改时才会显示该值。

我会注意到我的代码看起来并不像这样,而且我的要求有点复杂, 只是为了说明问题,我创建了一些概念上相似的东西。

所以我很想回答我提出的问题,而不是一个可以解决这里问题的特定技巧。

【问题讨论】:

    标签: angular rxjs angular-reactive-forms


    【解决方案1】:

    我想我找到了! 解决办法在于rxjs的算子。 我没有完全理解,但它有效! 如果有人想对此发表评论,我很乐意听到。

    constructor(){
     this.customerState$= this.myForm.controls.customerId.valueChanges.pipe(
      shareReplay(1)
    );
    }
    

    【讨论】:

    • 你是对的。就在我为您准备答案的那一刻:stackblitz.com/edit/angular-ivy-qkhigq?file=src/app/… shareReplay(1) 将缓存最后发出的值。由于值更改是在异步管道订阅设置之前完成的(输入更改可能在模板初始化之前发生),因此您需要缓存此值以将其显示在您的异步管道订阅中。
    • @enno.void 感谢您的善意!显然有时你只需要知道你在问什么,以便自己找到答案......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-07
    • 1970-01-01
    • 2020-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多