内存泄漏使用knockout.js 2.3.0和jquery mobile 1.3.1

时间:2014-12-09 10:45:23

标签: knockout.js memory-leaks

我们正在使用knockout 2.3.0和jquery mobile 1.3.1。我们使用$ .mobile.changePage api从一个屏幕转换到另一个屏幕,我们将ko ViewModel绑定到pagebeforeshow中相应的dom元素,并使用pageshow中的removeNode清理前一个屏幕的绑定。以下是相同的代码:

    $(document).ready(function() {
        $(document).on('pageshow', function(event, ui) {
            var prevId = ui.prevPage.attr('id');
            console.log('Clean node = ' + prevId);
            if (prevId && $('#' + prevId)){
                if($('#' + prevId)[0]){
                    console.log("$('#' + prevId) =  " + $('#' + prevId)[0]);
                    ko.removeNode($('#' + prevId)[0]);
                }
            }
        });

        $(document).on('pagebeforeshow', function(event, ui) {
            var Screen1VM = function() {
            };
            var Screen2VM = function() {
            };
            var path = event.target.id;
            if(path == 'Screen1'){
                var vmObj = new Screen1VM();
                ko.applyBindings(vmObj, document.getElementById('Screen1'));
            }else if(path == 'Screen2'){
                var vmObj = new Screen2VM();
                ko.applyBindings(vmObj, document.getElementById('Screen2'));
            } 
        });
    });

在Chrome开发工具上明确执行垃圾收集并过滤对象Screen1VM和Screen2VM之后获取堆快照,我们看到这些引用由每个不断增长的淘汰对象数组保存。对象计数总是等于我们访问屏幕的次数,而且这个数量永远不会下降。如果这里有任何错误,请告诉我。

0 个答案:

没有答案