替换作为参数发送的可观察的淘汰赛

时间:2018-10-26 13:49:11

标签: typescript knockout.js observer-pattern

我要发送两个可观察值作为参数,我想用另一个可观察值替换这两个;由于某些原因,它不会被替换,但是如果我更改可观察对象上的值,它将起作用。

private searchAndReplace = (flag: string, observable1: KnockoutObservable<string>, observable2: KnockoutObservable<string>) => {
        const itemFound = this.items.find((item) => item.flag === flag);
        if (itemFound) {
            observable1 = item.observableX;
            observable2 = item.observableY;
        }
    }

在这种情况下,我想用该项目的可观察值替换发送的变量,但它似乎不起作用...

1 个答案:

答案 0 :(得分:1)

  

在这种情况下,我想替换发送的变量...

不能。您拥有的参数没有以任何方式连接到用作函数参数的变量(JavaScript是字符串传递值,它没有将引用传递给变量的传递引用。功能)。

很明显,如果您只想设置这些可观察对象的值,则可以这样做:

if (itemFound) {
    observable1(item.observableX());
    observable2(item.observableY());
}

您还可以订阅新的Observable,但最终可能会得到很多订阅:

// Probably a bad idea
if (itemFound) {
    item.observableX.subscribe(observable1);
    item.observableY.subscribe(observable2);
}

...但是,如果您真的想替换可观察对象本身,那么最好的办法就是让searchAndReplace 返回这对可替换现有对象的可观察对象对: / p>

private searchAndReplace = (flag: string, observable1: KnockoutObservable<string>, observable2: KnockoutObservable<string>) => {
    const itemFound = this.items.find((item) => item.flag === flag);
    if (itemFound) {
        return [item.observableX, item.observableY];
    }
    return [observable1, observable2];
}

然后在调用它的地方使用解构分配:

[original1, original2] = searchAndReplace("flag", original1, original2);