我们正在使用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之后获取堆快照,我们看到这些引用由每个不断增长的淘汰对象数组保存。对象计数总是等于我们访问屏幕的次数,而且这个数量永远不会下降。如果这里有任何错误,请告诉我。