我有一个名为SettingsBar
的课程,在Sencha Touch 2.3中扩展TitleBar
。我正在使用的SettingsBar
上有几个按钮。当您单击Settings
按钮时,该栏将添加到面板中,它显示正常。
您可以点击SettingsBar
上的按钮,应用中会发生不同的事情。我进行了设置,以便您再次单击SettingsBar
按钮可以使Settings
消失。因此Settings
按钮会添加和删除SettingsBar
。
添加SettingsBar
并单击某些按钮后,SettingsBar
将被删除,SettingsBar
的状态不会保存。按钮返回到原始文本(单击它们时文本会更改),并且它们的事件处理不再有效。你只需点击它们就没有任何反应。
这是我添加和删除SettingsBar
的代码:
settingsTap: function(){
if(settingsToolbar.added){
Ext.getCmp('mainview').removeAt(2);
console.log('added: '+settingsToolbar.added);
}else{
Ext.getCmp('mainview').add(settingsToolbar);
console.log('added: '+settingsToolbar.added);
}
settingsToolbar.added = !settingsToolbar.added;
}
事件处理正在我的控制器中完成。当从面板中删除SettingsBar
时,为什么要删除按钮并删除它们上的事件处理?
答案 0 :(得分:1)
这很麻烦,已被问过好几次了。
在删除组件时完全销毁组件时最安全的方法(你应该总是这样做,它会回收大量内存),就是在该组件的initialize
函数中声明事件处理程序,或其父组件,无论您认为合适的地方,例如:
initialize: function(){
var me = this;
me.add({
xtype: 'list',
grouped: true,
indexBar: true,
itemTpl: '{first} {last}',
listeners: [
{
event: 'itemtap',
fn: function(dataview, index, target, record, e){
// do something
}
}
]
});
}
这是itemtap
上Ext.List
事件的示例。让我们根据你的情况进行调整。
答案 1 :(得分:0)
默认情况下,子组件从容器中删除时会被销毁。在谈到Ext组件时,“destroy”意味着删除所有侦听器和引用,以便垃圾收集器可以清除对象。
您可以通过更改容器的autoDestroy
选项(在您的情况下为标题栏)来防止销毁已删除的组件。不要忘记,当你完成它们时,你必须自己调用每个组件的destroy
方法,否则你将在你的应用程序中创建内存泄漏。