2

以下のオブジェクトが""マップされると、配列内の空の値は監視可能な配列で false としてマップされます。

var d2 = {
    "values": [{"9", false, "", true, null, "", "", ""]
};

var viewmodel2 = ko.mapping.fromJS(d2);

これを使用して json にマップし直すko.mapping.toJSON(viewmodel2);と、結果は次のようになります。

{ "values": [
    "9",
    false,
    false,
    true,
    null,
    false,
    false,
    false] }

配列の最後の 3 つの文字列値が false に変換されることに注意してください。

これはバグですか?またはサポートされていないブール値と文字列を含む配列です

ここにフィドルがあります。

4

2 に答える 2

2

これは確かにバグであり、現在は修正されています。次の 2 つのことが原因でした。

  • どのキーが配列に含まれているかを確認する等価比較では、「===」の代わりに「==」演算子が使用されていたため、「false」と「」が同じキーであると見なされていました。
  • 次に、重複キー処理ロジックの一部として、配列内のすべてのキーを並べ替えます。ただし、キー コールバックを明示的に指定しない場合は、項目の順序が重要になる可能性があるため、これは行うべきことではありません。

最新バージョンの 1.2.3 は GitHub で入手でき、NuGet パッケージも作成されています。Srluisreyes によって親切に作成された複製 jsfiddle も機能するようになりました。

于 2011-08-02T12:22:08.940 に答える
1

これは明らかにバグのようです。

私はあなたの jsFiddle コードをフォークし、toJSON メソッドがオブジェクトの解析を開始するときに問題があるように思われることを発見しました。

これがあまり意味をなさない場合は、この jsfiddle でオブジェクトの先頭にある false を "" に、またはその逆に変更してみてください。http://jsfiddle.net/5HhMn/

この問題について、Steve Sanderson の github ページ https://github.com/SteveSanderson/knockout.mappingに投稿することをお勧めします。

于 2011-08-01T02:44:00.180 に答える