0
树面板和存储内存管理ExtJS的TreePanel中内存管理问题
嗨, 我是新来的Ext JS,并不能找到一个答案,我的问题。 我有一个TreePanel和一个包含一些过滤器的菜单。当我更换过滤器时,我必须重新加载树。所以我在菜单上有一个监听器,当选择完成时,它调用loadElementContent。内容每次都能正确加载,唯一的问题是内存消耗只是上升和下降。我已经尝试销毁每个节点,当我从树中删除它时,我尝试使用elemStore.removeAll()从商店中删除元素,但似乎没有任何效果。 任何帮助将不胜感激。代码如下:
树控制器:
Ext.define('myController.Index', {
extend: 'Ext.app.Controller',
stores: ['Elements'],
models: ['Element'],
views: ['index.MainTabPanel', 'GenericTree'],
refs: [
{
ref: 'elementsTree',
selector: 'maintabpanel generictree[name=myTree]'
}
],
init: function() {
this.control({
'viewport > maintabpanel': {
render: this.onMainTabPanelRender,
myEvent: this.buttonHandler
}
});
},
setProxyParameters: function(proxy) {
proxy.extraParams.filter_key = 12;
return proxy;
},
onMainTabPanelRender: function() {
this.on('onElemStoreLoadSucces', this.onElemStoreLoadSuccess);
},
loadElementContent: function() {
var elemStore = this.getElementsStore();
elemStore.setProxy(
this.setProxyParameters(
elemStore.getProxy()));
elemStore.load({
scope: this,
callback: function(elements, elOperation, elSuccess) {
if (elSuccess) {
this.fireEvent('onElemStoreLoadSucces');
} else {
Ext.Error.raise(new Mytils.JSONError
(elemStore.getProxy(), elOperation));
}
}
});
},
onElemStoreLoadSuccess: function() {
this.loadTree(this.getElementsStore().getRange());
},
loadTree: function(elements) {
var root = this.getElementsTree().getRootNode();
this.clearChildNode(root);
this.appendChildrentToNode(root, elements);
console.log(root);
},
clearChildNode: function(node) {
console.log('removing children');
while (node.firstChild) {
node.removeChild(node.firstChild);
}
},
appendChildrentToNode: function(root, elements) {
console.log('appending children');
Ext.Array.each(elements, function(element) {
element.set('ischecked', 0);
element.set('name', element.get('element_id'));
element.set('leaf', true);
root.appendChild(element);
});
},
buttonHandler: function() {
this.loadElementContent();
}
});
代理:
/**
* This class is merely an Ext.data.proxy.Ajax, using a JSON reader
* and writer, and with some preset config properties.
*/
Ext.define('myUtils.MyAjaxProxy', {
extend: 'Ext.data.proxy.Ajax',
alias: 'proxy.myajax',
constructor: function (config) {
// Preset some config options, if not specified differently.
Ext.applyIf(config, {
// By default, the JSON requests are sent with a 'start', 'page' and 'limit' parameters.
// As long as data is retrieved all at once, these are not needed, so remove them:
startParam: undefined,
pageParam: undefined,
limitParam: undefined,
// By default, a parameter with the name "_dc" ("disable caching") and a random value is added to each request,
// to prevent caching of the response and enforce each request to be handled by the server.
// Set this config parameter to false to eliminate the _dc parameter and thus enable caching:
// noCache: false,
reader: {
type: 'json',
// The names of the fields in a JSON response containing the success/failure status,
// and (in case of error) the corresponding error message.
successProperty: 'success',
messageProperty: 'error_msg'
},
writer: {
// Configure the writer to only POST modified fields.
writeAllFields: false
}
});
myUtils.MyAjaxProxy.superclass.constructor.call(this, config);
}
});
商店:
Ext.define('myStore.Elements', {
extend: 'Ext.data.Store',
requires: ['myUtils.GsaAjaxProxy'],
model: 'myModel.Element',
//autoLoad: true,
proxy: {
type: 'myajax',
url: getApiURL('getElements'),
reader: {
root: 'elements'
}
}
});
型号:
Ext.define('myModel.Element', {
extend: 'Ext.data.Model',
fields: ['key',
'element_key',
'element_id',
'element_value'
]
});