Knockout 2.3.0を使用したIEでメモリ リークが発生するという問題があります。画面に表示される結果のリストがあり、その結果セットにはページング機能があります。ページングされた結果の次のセットを取得するために、コントローラーへの AJAX コールバックがあります。最初のページを画面に最初にバインドするとき、IE のメモリ負荷は約 150Mb ですが、各ページで約 50Mb から 100Mb が追加されます。この問題は、Chrome または FireFox では発生しません。
この問題はよくあることのようで、次のような多くの例を調べまし た 。
var householdViewModel = ko.observable();
var HouseholdViewModel = function (data) {
ko.mapping.fromJS(data, mapping, this);
};
var AccountViewModel = function (data) {
ko.mapping.fromJS(data, mapping, this);
};
var mapping = {
'Households': {
create: function(options) {
return new HouseholdViewModel(options.data);
}
},
'Accounts': {
create: function (options) {
return new AccountViewModel(options.data);
}
}
};
次のような AJAX 呼び出しを行うために MVC フレームワークを使用しています。
@Ajax.ActionLink(">", "PageInfo", new {pageOption = "Next"}, new AjaxOptions {UpdateTargetId = "SearchResults", HttpMethod = "GET", OnBegin = "OnBeginAjaxListManipulation", OnComplete = "OnCompleteAjaxListManipulation"}, new {@class = "textNavigationElement"})
次のようなコールバック JS メソッドを使用します。
function OnCompleteAjaxListManipulation() {
//ko.cleanNode(document.getElementById("SearchResults"));
var HHVM = { Households: ko.mapping.fromJS(@Html.Raw(Json.Encode(Model.Households))) };
householdViewModel(new HouseholdViewModel(HHVM));
//ko.applyBindings(householdViewModel, document.getElementById("SearchResults"));
}
Info.cshtml というページと、検索結果を表示する results.cshtml という部分ページがあることを意味する必要があると思います。情報ページで、次の呼び出しを行います。
var HHVM = { Households: ko.mapping.fromJS(@Html.Raw(Json.Encode(Model.Households))) };
householdViewModel(new HouseholdViewModel(HHVM));
ko.applyBindings(householdViewModel, document.getElementById("SearchResults"));
検索結果は、最初のページでは問題なく表示されますが、2 ページ目では何も表示されません。JS コールバックに 2 つ目の applyBindings を追加すると機能しますが、メモリ リークの問題が発生します。私はこれを理解できません。どんな助けでも大歓迎です。
ジョシュ