如何在Sencha Touch中销毁非活动视图

时间:2012-05-11 08:42:45

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

我坚持认为这个问题非常重要。 在简单的Sencha Touch应用程序中,我有很多观点。我的主视图是一个TabPanel,底部有对接图标。有时在我的应用程序中,我切换到Tabpanel之外的另一个视图。我不希望DOM重载视图,我不再需要了所以我正在寻找一个解决方案来销毁视图,当它处于非活动状态时。 我试过这个,同时在我的控制器中切换到另一个视图:

this.getMainview().destroy();

似乎Mainview被删除但我收到错误:

Uncaught TypeError: Cannot read property 'dom' of null

所以我想.destroy() - 方法有什么问题或是否有更好的方法来处理这个问题?

3 个答案:

答案 0 :(得分:6)

在移至新视图之前,您可以调用以下代码来删除当前视图

Ext.Viewport.remove(Ext.Viewport.getActiveItem(), true);  

或者您也可以提供项目对象而不是ActiveItem

答案 1 :(得分:5)

我以前多次都遇到过这个问题。目前看来,在Sencha Touch 2中没有高效且实际上无错误的解决方案。当第二次再次添加视图时,将再次显示该不愉快的错误。

可能的解决方案:

此代码段:

your_container(your_container.getActiveItem(), false);

实际上不会从内存中破坏您的子组件,而是从DOM中删除。稍后当你添加它时,就没有错误(正如我测试的那样)。

希望它有所帮助。

答案 2 :(得分:0)

我会揭露我的情况以及我是如何解决它的。

我有一个带有图标的TabPanel。其中一个选项卡显示项目列表。当您点击某个项目时,您将被带到显示其描述的新面板。如果单击“后退”按钮,该面板将被销毁并返回到“列表”。这样你就可以破坏"描述"面板现在没用了。

所以我所做的是创建一个函数来实例化描述面板,具体取决于所点击的项目的索引:

function project(i) {
    var v;
    switch(i) {
        case 0:
            v = Ext.create( 'Ext.Panel', {
                title: 'title',
                layout: { type: 'fit' },
                id: 'project0',
                iconCls: '',
                style: '',
                html: 'my html'
                });
            break;
    }
    return v;
}

现在,在' itemtap'列表的事件我有这个:

var lastItem = container.add(project(i));
itemsList.hide(); //hide the List and display only the new Panel in the container

现在,标题中有一个按钮可以返回上一个视图(即列表),这就是事件'点击'那个按钮:

container.remove(lastItem, true); //hide and destroy it
itemList.show(); //show the List again

因此,如果我在List和Description项目(Panels)之间来回走动,那么每次点击它们时我都会得到一个新实例,并且当我返回时它会被摧毁。

这解决了我的问题。