当删除按钮时,它们会丢失Sencha Touch 2.3中的事件处理

时间:2013-12-11 21:32:30

标签: extjs sencha-touch sencha-touch-2 sencha-touch-2.1

我有一个名为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时,为什么要删除按钮并删除它们上的事件处理?

2 个答案:

答案 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
                }
            }
        ]
    });
}

这是itemtapExt.List事件的示例。让我们根据你的情况进行调整。

答案 1 :(得分:0)

默认情况下,子组件从容器中删除时会被销毁。在谈到Ext组件时,“destroy”意味着删除所有侦听器和引用,以便垃圾收集器可以清除对象。

您可以通过更改容器的autoDestroy选项(在您的情况下为标题栏)来防止销毁已删除的组件。不要忘记,当你完成它们时,你必须自己调用每个组件的destroy方法,否则你将在你的应用程序中创建内存泄漏。