0

私はプログラミング全般に不慣れですが、特にノックアウトです。foreach バインディングが設定されているテーブルがあります。このテーブルには、ajax を介して取得された mysql データベース値からチェックされた値が入力されるチェックボックスになりたい列があります。チェック済みバインディングは 0 または 1 を取り、チェック済みおよびチェックなしに大まかに変換できる必要があることを理解しています。

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

チェックボックスの場合、KO は、パラメーター値が true の場合は要素をチェックし、false の場合はチェックを外すように設定します。実際にはブール値ではない値を指定すると、大まかに解釈されます。つまり、ゼロ以外の数値、null 以外のオブジェクト、および空でない文字列はすべて 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 の場合でも、チェックボックスが常にチェックされていることを除いて、すべて正常に機能します。なぜこれが機能しないのですか?

4

4 に答える 4

0

Javascript には、真/偽を処理する特定の方法があります。ステートメントは「真実」または「偽」になる可能性があります。たとえば、「0」は「真実」ですが、真実ではありません。JavaScript には 2 種類の比較演算子があります。等しいかどうかをテストしたい場合は、"==" または "===" (または、等しくない場合は "!=" と "!==") を使用できます。最後のものは厳密な平等を意味します。次のコードでテストできます。

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

最初の 2 つのアラートが表示されます。最後のものはしません。文字列は true (定義されておらず、null でもない) ですが、厳密には true と等しくありません。

あなたの場合、ノックアウトは「通常の」平等(真実)をテストします。つまり、「0」または「1」の文字列はどちらも真になります。変数が純粋な整数である場合、0 は偽で厳密に偽に等しく、1 は真で真に等しくなります。

したがって、JSON でブール値または整数のいずれかを使用する必要があり、それが機能します。

于 2013-08-05T20:21:47.507 に答える