Asp.net mvc 4 淘汰2.3.0 IE内存泄漏

Asp.net mvc 4 淘汰2.3.0 IE内存泄漏,asp.net-mvc-4,knockout.js,knockout-2.0,knockout-mapping-plugin,Asp.net Mvc 4,Knockout.js,Knockout 2.0,Knockout Mapping Plugin,我遇到了一个问题,在IE中内存泄漏,使用淘汰2.3.0。我有一个显示在屏幕上的结果列表,该结果集具有分页功能。有一个AJAX回调控制器以获得下一组分页结果。当最初将第一个页面绑定到屏幕时,IE的内存负载约为150Mb,但每个页面都会增加50Mb到100Mb,这个问题在Chrome或FireFox中不会发生 这个问题似乎很常见,我已经看了很多例子,例如: 我试图复制此模型但没有成功,这是我的KO脚本文件的外观: var householdViewModel = ko.observable();

我遇到了一个问题,在IE中内存泄漏,使用淘汰2.3.0。我有一个显示在屏幕上的结果列表,该结果集具有分页功能。有一个AJAX回调控制器以获得下一组分页结果。当最初将第一个页面绑定到屏幕时,IE的内存负载约为150Mb,但每个页面都会增加50Mb到100Mb,这个问题在Chrome或FireFox中不会发生

这个问题似乎很常见,我已经看了很多例子,例如: 我试图复制此模型但没有成功,这是我的KO脚本文件的外观:

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);
        }
    }
};
我正在使用MVC框架进行AJAX调用,如下所示:

@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"));
第一页的搜索结果将显示良好,但第二页将不显示任何内容。如果我在JS回调中添加第二个applyBindings,它会工作,但会出现内存泄漏问题。我想不出这一个,任何帮助都将不胜感激


Josh

我通过手动控制可观察阵列修复了它,这可能是您应该使用的方式。首先,我将我的模型更改为:

var Households = ko.observableArray(HouseholdViewModel);

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调用的触发方式,我删除了UpdateTargetId并决定自己控制它。代码如下所示:

@Ajax.ActionLink(">>", "PageInfo", new {pageOption = "Last"}, new AjaxOptions {HttpMethod = "GET", OnBegin = "OnBeginAjaxListManipulation", OnComplete = "OnCompleteAjaxListManipulation", OnSuccess = "BindModel"}, new {@class = "textNavigationElement"}) 

就这样!结果是,每次绑定模型时,它都会清除可观察数组并读取项,因为将可观察数组绑定到页面时,我们不需要执行任何ko.CleanNode和rebind:-)

我希望这能帮助其他人

    function BindModel(e) {
        var isBound = !!ko.dataFor(document.getElementById("SearchResults"));
        if (isBound)
            Households.removeAll();

        $.each(e.Households, function (index, value) {
            var hh = new HouseholdViewModel(value);
            Households.push(hh);
        });

        if (!isBound)
            ko.applyBindings(Households, document.getElementById("SearchResults"));
    }