2012-04-10 169 views
1

我下面舉個例子: http://jsfiddle.net/jLkxG/6/複選框非布爾值?

的is_checked屬性可以有兩個值:Yes或No.複選框應進行檢查,如果值是yes,並點擊保存的鏈接時,該財產應分配是否則取決於是否選中複選框。

你會如何在knockoutjs中做到這一點?

+2

你鏈接到錯誤的jsfiddle?這似乎與你的問題沒有關係。 – 2012-04-10 19:20:09

+0

固定鏈接。 – firebird 2012-04-10 20:23:59

回答

2

除了計算的另一種方法是使用「訂閱」聆聽值的變化。例如,綁定到is_checked並將該值設置爲true或false。然後訂閱該可觀察值並根據需要將另一個屬性設置爲是/否。看到這裏的小提琴:http://jsfiddle.net/johnpapa/jLkxG/8/

HTML

<input type="checkbox" data-bind="checked: checkedvals.is_checked"/> 
<label>Test</label><br/> 

<pre data-bind="text:displayJS"> 
</pre>​ 

的JavaScript

var viewModel = (function() { 
    var self = this; 
    self.checkedvals = { 
     is_checked : ko.observable(true), 
     is_checked_val : ko.observable("Yes") 
    }; 
    self.checkedvals.is_checked.subscribe(function(){ 
     self.checkedvals.is_checked_val(self.checkedvals.is_checked() ? "Yes" : "No"); 
    }); 

    self.displayJS = ko.computed(function() { 
     return JSON.stringify(ko.toJS(checkedvals), null, 2); 
    }); 
})(); 
ko.applyBindings(viewModel);​ 
3

你的第一個問題是,你錯過了你的綁定括號:

<input type="checkbox" value="Yes" data-bind="checked: is_checked() == 'Yes'"/> 

現在複選框將覈對無誤的負載。

更大的問題是單擊複選框將不會寫回值。如果將is_checked()更改爲bool,則它將正常工作。所以,如果您有:

self.is_checked = ko.observable(true); 

data-bind="checked: is_checked" 

它會工作。取消選中該框會更新is_checked的值。如果它真的對你很重要,那麼它就是Yes/No而不是True/False,那麼你將不得不編寫一些代碼來將真/假檢查狀態轉換爲Yes/No。有幾種方法可以解決這個問題。我會嘗試一個計算可觀察。看到這裏:http://jsfiddle.net/jLkxG/7/