Knockout在select show / hide上计算重置

时间:2013-07-30 12:01:14

标签: javascript mvvm knockout.js

我最近在淘汰赛中遇到了一个奇怪的行为。为了说明,请看一下这个小提琴:http://jsfiddle.net/77aP3/

this.myVar = ko.observable();
    this.vars = ko.observableArray(["Dave", "Steve", "Jim"]);
    this.tf = ko.observableArray([true, false]);
    this.show = ko.observable();
    var self = this;

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

当您更改第一个选择(Dave,Steve,Jim)中的值时,视图模型中的相应变量会发生变化。第二个选择会更改是否显示第一个。

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

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

1 个答案:

答案 0 :(得分:2)

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

因此,如果您将myVarChanger的{​​{1}}方法更改为read,则会产生预期的行为:

return self.myVar();

演示JSFiddle