Javascript 选择“显示/隐藏”时的击出计算重置

Javascript 选择“显示/隐藏”时的击出计算重置,javascript,mvvm,knockout.js,Javascript,Mvvm,Knockout.js,我最近在淘汰赛中遇到了一个奇怪的行为。为了说明这一点,请看一下这把小提琴: 更改第一个选择中的值(Dave、Steve、Jim)时,视图模型中相应的变量将更改。第二次选择将更改是否显示第一次选择 尝试在第一次选择中选择Steve或Jim,然后将其隐藏(在第二次选择中选择false)。再次显示时,myVar的值将自动更改为Dave(默认值),而不是切换到您选择的值。如果不使用ko.computed,而是使用纯可观测值,则不会发生这种情况 这应该发生吗?我的猜测是,knockout在显示select

我最近在淘汰赛中遇到了一个奇怪的行为。为了说明这一点,请看一下这把小提琴:

更改第一个选择中的值(Dave、Steve、Jim)时,视图模型中相应的变量将更改。第二次选择将更改是否显示第一次选择

尝试在第一次选择中选择Steve或Jim,然后将其隐藏(在第二次选择中选择false)。再次显示时,myVar的值将自动更改为Dave(默认值),而不是切换到您选择的值。如果不使用ko.computed,而是使用纯可观测值,则不会发生这种情况

这应该发生吗?我的猜测是,knockout在显示select时会重新评估计算变量,就像它通常在程序执行的开始时所做的那样。

您有这种“奇怪”的行为,因为您的read方法中有一个“bug”。名义上,您返回的是
myVar
可观察函数本身,而不是其值。因此,您的选择将重置为“Dave”,因为
self.myVar
函数在
vars
数组中不存在

因此,如果您将
myVarChanger
read
方法更改为
return self.myVar()它将产生预期的行为:

this.myVarChanger = ko.computed({
        read: function () {
            return self.myVar();
        },
        write: function (value) {
            self.myVar(value);
        }
    });
演示

this.myVarChanger = ko.computed({
        read: function () {
            return self.myVar();
        },
        write: function (value) {
            self.myVar(value);
        }
    });