2013-07-30 45 views
1

我最近在淘汰賽中遇到了一個奇怪的行爲。爲了說明,看看這個小提琴: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); 
     } 
    }); 

當改變在第一選擇(戴維,史蒂夫,吉姆),在視圖模型的相應的變量的變化的值。第二個選擇會更改是否顯示第一個。

嘗試在第一個選擇中選擇Steve或Jim,然後隱藏它(在第二個選擇中選擇false)。再次顯示時,myVar的值會自動更改爲Dave(默認值),而不是切換到您選擇的那個。如果您不使用ko.computed,而是使用純觀察值,則不會發生這種情況。

這是應該發生的嗎?我的猜測是knockout重新評估計算變量,當它顯示select時,就像程序執行開始時通常所做的那樣。

回答

2

你有這個「奇怪」的行爲,因爲你的閱讀方法有一個「錯誤」。你只能返回myVar可觀察函數本身而不是它的值。因此,您的選擇將被重設爲「Dave」,因爲vars陣列中不存在self.myVar功能。

所以,如果你改變你的myVarChangerread方法return self.myVar();它會產生預期的行爲:

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

演示JSFiddle