Javascript 如何在创建观察者时而不是在发出值时强制计算观察者中的表达式
我在这个链接上发布了一个类似的问题:但是没有收到任何答案(我原以为我有答案,但现在我不太确定),并且仍然很困惑,所以我非常感谢一些反馈和指导 我有一个反应式表单,在该表单中,以下订阅中的函数在可观察对象发出数据(并调用订阅函数)时计算Javascript 如何在创建观察者时而不是在发出值时强制计算观察者中的表达式,javascript,angular,rxjs,Javascript,Angular,Rxjs,我在这个链接上发布了一个类似的问题:但是没有收到任何答案(我原以为我有答案,但现在我不太确定),并且仍然很困惑,所以我非常感谢一些反馈和指导 我有一个反应式表单,在该表单中,以下订阅中的函数在可观察对象发出数据(并调用订阅函数)时计算itm[“value”]。length-1 但是,我希望订阅回调函数表达式itm[“value”].length-1在创建可观察/(FormControl)时进行计算 例如,在创建表单控件时,itm[“value”]。长度可能只有2,但在可观察对象发出数据时,itm
itm[“value”]。length-1
但是,我希望订阅回调函数表达式itm[“value”].length-1
在创建可观察/(FormControl)时进行计算
例如,在创建表单控件时,itm[“value”]。长度
可能只有2,但在可观察对象发出数据时,itm[“value”]。长度
可能是6或7或任何其他数字。我如何(以编程方式)确保“2”(或其等效值)的值进入订阅回调,而不是“6”或“7”,或可观察对象发出时的任何值
我想到了两种方法,我不确定这两种方法是否有效:
const itmLength=itm[“value”].length,然后构造回调,即:
itmLength
是否包含实际值(在这种情况下,上述方法会起作用),或者更确切地说是指向itm[“value”].length的指针(在这种情况下,上述方法不会起作用)。我认为这种方法工作正常,但后来我更改了代码,遇到了“块作用域变量”的问题,解决这个问题的唯一方法是在内部循环之外声明常量/变量,这样做之后,代码不再给我预期的“2”,而是继续给我“6”或“7”我不想要的。那么一般来说,第一种方法有效吗?(或者,const itmLength
只是一个指针,在这种情况下,itm[“value”]。仅在可观察物发射时才计算长度)
第二种方法是将管道
添加到可观察对象中,类似于:
this.formCtls[controlName].valueChanges.pipe(
switchMap(v=>Object.assign({},{value: v}, {length: itm["value"].length}))
.subscribe(val=>{
itm["value"][val.length-1]=val.value;
this.renderDataArray();
});
我不确定第二种方法是否有任何好处,也不确定itm[“value”]”。只有在valueChanges
Observable发出时,而不是在创建formControl回调时,才会计算length
如果有任何人有任何解决方案或可以提供一些关于我这个问题的见解,请提前向我表示感谢
=====
以下是基于@Fan Cheung的优秀解决方案的最终答案(考虑到resultsSelector
的不推荐):
of(itm["value"].length).
pipe(switchMap(length=>this.formCtls[ctlName].valueChanges.
pipe(map(newVal => [newVal,length]))
)).
subscribe(([newVal,length])=> . . .
您可以将itm[“value”]
.length组合成整数而不是指针的流,因此它在创建时是固定的<操作员的代码>只会发出一次,然后切换到valueChanges
流
of(itm["value"].length)
.pipe(switchmap(length=>this.formCtls[controlName].valueChanges,
// result seletor
value=>[length,value]))
.subscribe(([length,value])=>{
....... do you stuff
});
非常感谢。这看起来是一个很棒的方法,但我有一个问题,我注意到resultSelector
已被弃用。在这种情况下有好的解决办法吗?非常感谢。我看到这里有一个解决办法,我要玩这个:谢谢!很高兴能帮上忙。你的解决方案效果很好。非常感谢!(考虑到反对意见,我在OP中给出了最终答案):
of(itm["value"].length).
pipe(switchMap(length=>this.formCtls[ctlName].valueChanges.
pipe(map(newVal => [newVal,length]))
)).
subscribe(([newVal,length])=> . . .
of(itm["value"].length)
.pipe(switchmap(length=>this.formCtls[controlName].valueChanges,
// result seletor
value=>[length,value]))
.subscribe(([length,value])=>{
....... do you stuff
});