0

IE に固有の奇妙な問題があります (IE8、9、および 10 で始まる複数のバージョンを確認しました)、モデル レコードが乗算 されます (つまり、2 つのレコードがある場合は 2X2 = 4 と表示され、3 の場合は 4 と表示されます)。 3X3 = 9) . ページをロードした後に getJson を介してフェッチする viewModel にバインドする単純な Grid があります。これがコードスニペットです(最小限に抑えたものは他にもあります)-

function createCommentsKO(){
    $.getJSON('http://www.tempSite.com/getMyjson',
        function (data) {
            ...
            viewModelComments.allComments = ko.mapping.fromJS(data.AllComments);
            ...
            ko.applyBindings(viewModelComments, document.getElementById("divComments"));
    });

グリッドでは、次のように witnin を繰り返します -

<div id="divComments">
...
<table>
<thead>...</thead>
<tbody data-bind="foreach: allComments">
    <tr data-bind="attr:{className:_Deleted()?'deletedTR':'deletedTR_NO'}">
        <td nowrap="nowrap">
        <span data-bind='text:Comment'></span>
        ...
       </td>
   </tr>
</tbody>
</table>
...
</div>

これはどのように可能ですか?IE がモデル レコードを増やすのはなぜですか。Firefox では完全にレンダリングされます。どんな手掛かり?


詳細情報 - ここで viewModelComments.allComments は、グリッドにバインドされた Observable 配列です。返された json の結果は、配列とその他のオブジェクトを含む JSON オブジェクトです。小さな部分の実装を分離し、適切な結果を示した次のことを試しました-

 viewModelComments.allComments(data.AllComments);

以下とどう違うのですか:(ところで、オブジェクトの配列内の各要素をさらに使用するために観察可能にする必要があります)

 viewModelComments.allComments = ko.mapping.fromJS(data.AllComments);
4

1 に答える 1

1

最後に、IE の場合、KO バインディングを作成して適用した $().ready が 2 回トリガーされたことが判明しました。部分的なコンテンツを動的にロードしていました。動的にロードされたページに $().ready to load KO がありました - これは IE によって 2 回呼び出されました。そのため、$().ready の代わりに callDocReady 関数に変換し、コンテンツを動的にロードした後に手動で呼び出しました。これにより、一度だけ呼び出されるようになりました。

申し訳ありませんが、それはKOの問題だと思います。私が見つけたもう1つのことは、コントロールがKOにバインドされていて、jquery.numeric.jsやjqueryui autocompleteなどのjQueryプラグインと統合する必要がある場合、これはKOバインディングの後に実行する必要があることです。その場合、それらの統合はオーバーライドされます (つまり、機能しません)。

それが役に立てば幸い

于 2013-05-31T08:09:08.503 に答える