2013-08-05 27 views
0

我是一般的編程新手,但尤其是淘汰賽。我有一個正在填充foreach綁定的表。在這個表中,我有一個列,我想成爲一個複選框,其檢查值從通過ajax檢索的mysql數據庫值填充。我明白,檢查綁定應該能夠採取0或1,鬆散轉換來檢查和取消選中。Knockout複選框綁定到ajax檢索值

http://knockoutjs.com/documentation/checked-binding.html

對於複選框,KO會設置元素時 參數值爲true,當它是假的檢查,並選中。如果你給 一個實際上不是布爾值的值,它將被鬆散地解釋。 這意味着非零數字和非空對象和非空 字符串都將被解釋爲true,而零,null, 未定義,並且空字符串將被解釋爲false。

所以我們可以說這是我的ko.observableArray命名的部分:

{"id":"1","partdes":"asdf","partcost":"1.00","sellcost":"2.00","tax":"1"} 

而且我從我的表此代碼段:

<tbody data-bind="foreach: parts"> 
    <tr> 
     <td data-bind="text: id"></td> 
     <td data-bind="text: partdes"></td> 
     <td data-bind="text: partcost"></td> 
     <td data-bind="text: sellcost"></td> 
     <td><input type="checkbox" data-bind="checked: tax" /></td> 

      //And I added this line to get the actual value: 
     <td data-bind="text: tax"></td> 
    </tr> 
</tbody> 

,一切工作正常,除了該複選框始終是即使值爲0,也要進行檢查。爲什麼沒有這項工作?

回答

0

非零數字和非空的對象和非空字符串都將被 解釋爲真

在你的情況下,兩個"1""0"都是非空字符串,即投地true。如果你用的檢查結合的例子具有tax"tax": 1"tax": 0

+0

我相信你是正確的這裏我已閱讀,阿賈克斯通過布爾值的字符串。任何關於如何將值轉換回布爾值的建議? – user2577435

+0

>我讀過ajax將布爾值作爲字符串傳遞。 這是不正確的。您可以傳遞布爾值或數字或字符串。我建議檢查後端代碼。 如果您無法控制後端,則可以在前端接收時處理數據。例如:'data.parts.forEach(function(d){d.tax =(d.tax ==='0'?false:true);}); – amakhrov

+0

不幸的是我有控制後端,這是問題。在做了一些研究之後,我能夠使用_ $ success = settype($ tax,「boolean」); _在我的ajax調用的後端將我的變量轉換爲PHP中的布爾值。這將$ tax轉換爲布爾值,並以true/false的形式傳遞,允許我使用本地調用,而不必在前端更改我的任何代碼。 – user2577435

0

我創建jsfiddle數值
您的代碼會工作。

self.parts.push(new part({id: 1, tax: 0})); -- set as non checked 
self.parts.push(new part({id: 2, tax: 1})); -- set as checked 
self.parts.push(new part({id: 3, tax: true})); -- set as checked 
+0

是的,我看到你的例子工作,我可能應該創建這種類型的映射,可能必須。截至目前,我正在使用ko.mapping.fromJS(data,{},ViewModel.parts),因此該映射會自動傳遞。我不知道如何強制該值爲布爾值或整數。 – user2577435

+0

有[jsfiddle](http://jsfiddle.net/Lyw5F/1/)基於pashaplus的答案。 –

+0

我相信,當我更多地瞭解淘汰賽時,這可能是更好的解決方案。我選擇了amakhrov的答案,因爲我不必更改任何代碼來實現它。我會研究你的小提琴。 – user2577435

0

Javascript有一個處理真/假的特殊方式:一個語句可以是「truthy」或「falsy」。 例如「0」是「truthy」,但事實並非如此。在javascript中有兩種比較運算符。如果要測試相等性,則可以使用「==」或「===」(或「!=」和「!==」表示不相等)。最後一個意味着嚴格的平等。您可以使用以下代碼對其進行測試:

var test = "1"; 
if(test) { 
    alert("truthy"); 
} 
if(test == true) { 
    alert("truthy"); 
} 
if(test === true) { 
    alert("but not true!"); 
} 

將顯示前兩個警報。最後一個不會。字符串是truthy(既沒有定義也沒有空),但它並不嚴格等於true。

在你的情況,敲除測試「正常」的平等(真理)。這意味着「0」或「1」字符串將是真實的。如果你的變量是純整數,0將是虛假的並且嚴格等於假,並且1將是真實的並且等於真。

所以你必須在你的JSON中使用布爾值或整數,這將工作。

0

試試這個

<td><input type="checkbox" data-bind="checked: (tax==0||!tax)?false:true" /></td> 
+0

我試過了,它不適合我。我想基於其他答案,我需要這是一個整數,而不是一個字符串,它的工作。我在ajax調用的後端修改了我的php以返回false的真(在字符串中)。這可以修改以反映字符串值而不是整數?原諒我的愚蠢問題,但我不知道你在這裏做什麼。 – user2577435