Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Extjs 如何在sencha touch中从导航堆栈中删除特定视图?_Extjs_Navigation_Sencha Touch_Sencha Touch 2 - Fatal编程技术网

Extjs 如何在sencha touch中从导航堆栈中删除特定视图?

Extjs 如何在sencha touch中从导航堆栈中删除特定视图?,extjs,navigation,sencha-touch,sencha-touch-2,Extjs,Navigation,Sencha Touch,Sencha Touch 2,我正在推送这样的视图this.up('navView')。推送({xtype:'myView'}) 2->3->4->5(设置一些条件X)->6->(现在使用后退按钮反转)->5->4->2(因为条件X导致3已经消失)->1 如果这就是您的意思,那么您可以通过侦听navView中的“后退”事件来扩展控制器中的后退按钮功能。然后,一旦您获得了事件,您可以检查导航视图中的项目数量,并相应地决定弹出1个或2个或3个事件,因此通过1-2-3个etc视图向后跳。对于用户来说,这将使其看起来像是在您到达视图

我正在推送这样的视图
this.up('navView')。推送({xtype:'myView'})

<如何删除导航堆栈中间的特定视图?

至少我应该摆脱这个警告

[WARN][Ext.Component#constructor] Registering a component with a id (listxyz) which has already been used. Please ensure the existing component has been destroyed (Ext.Component#destroy().

我们有两种方法解决你的问题

首先是

二是


尝试使用以下命令从阵列中删除值:

var idx = this.up('navView').getItems().indexOf({xtype: 'myView'});
this.up('navView').getItems().splice(idx,1);

你的意思是,当你按下一个按钮(或后退按钮)时,它应该跳回2-3个视图,而不是仅仅一个视图

示例:遍历它所在的视图:

1->2->3->4->5(设置一些条件X)->6->(现在使用后退按钮反转)->5->4->2(因为条件X导致3已经消失)->1

如果这就是您的意思,那么您可以通过侦听navView中的“后退”事件来扩展控制器中的后退按钮功能。然后,一旦您获得了事件,您可以检查导航视图中的项目数量,并相应地决定弹出1个或2个或3个事件,因此通过1-2-3个etc视图向后跳。对于用户来说,这将使其看起来像是在您到达视图5时弹出的导航视图(在上面的示例中)视图3

代码如下:

back : function(){
    if(condition=="X"){
        //so if your 5th view (say) set some condition, then when you try to pop, instead of popping one, it will pop 3 views (say). 

        Ext.getCmp('navView').pop(3);
    }
}

如何找出正在停用的视图(例如,在离开视图5后,您只弹出3个视图,而不是在您使用navigation.pop(X)时)第一件事:不要在navigationview中使用remove或removeAt!remove和removeAt是容器()中的方法对象对内部元素进行计数,这在使用remove/removeAt时不会发生。因此,您可能会遇到一些问题,如第一页中显示的“后退按钮”,因为remove没有更新计数()

现在关于你的问题:使用pop(X)。你可以在pop之前查看哪个页面,这样你就不会有任何警告

在我的应用程序中,我有一个按钮返回到导航的第一页

    var ctx = Ext.getCmp('navView');
    var pages = ctx.getInnerItems().length -1;
    if(pages > 0){
        ctx.pop(pages);
    }
因此,您可以检查用户是否在“X”页面中,或者检查并比较最后一项:

    // compare with the position
    var ctx = Ext.getCmp('navView');
    var pages = ctx.getInnerItems().length -1;
    if(pages == 5){
        ctx.pop(2);
    }

    //OR compare with the last object
    var ctx = Ext.getCmp('navView');
    var innerElements = ctx.getInnerItems();
    var pages = ctx.getInnerItems().length -1;
    if(innerElements[pages].config.xtype == "myXtypeClass"){
        ctx.pop(2);
    }

在推送视图之前,请检查视图是否已经存在,如果已经存在,请将其销毁,这样您就不会收到这些警告,并且可以轻松导航

if(Ext.getCmp('myView')){
                Ext.getCmp('myView').destroy();
}

//Push myView

where  myView should be the id of that view declared in config of that view


    config: {

        id:'myView',

    }

未捕获的TypeError:Object[Object Object Object]没有方法'splice',我可以看到idx的值是-1。我知道了,然后我建议你试试@mayur答案:navView.remove('myView ItemId此处用单引号括起来,'true');extend:'Ext.navigation.View'和myView是什么类?试试这个。up('navView')。getItems()它应该会生成一个数组或对象,你可以迭代(例如,使用each),然后您应该删除/销毁您的视图!不工作。该视图仍然存在。我再次收到警告。[WARN][Ext.Component#constructor]使用id(
listxyz
)注册一个已使用的组件。请确保已销毁现有组件(
Ext.Component#destroy())
。我通常使用removeInnerAt(索引)如何打印推送视图的ID?您可以在Navigation view.conmsole.log(Navigation view)的项目中找到视图中当前的所有视图;要查看视图中的内容,请按按钮(或后退按钮)时它应该跳回说2-3个视图,而不是仅仅一个视图?例如:遍历视图:1->2->3->4->5->(现在反向)->4->2(因为3已经消失)->1??我正在导航1->2->3->4->5。11月我想从5转到3。但3已经在堆栈中,因此在推送时显示警告。我已经尝试使用pop(2),但这不是一个好的解决方案。有时它会触发错误。可能是因为没有足够的视图弹出。因此,添加一个if条件以检查堆栈上有多少视图,并检查您在哪个视图上。这将阻止抛出错误。Ext.getCmp('navView')给出undefinedthe“Ext.getCmp('navView')”只是为了演示如何获取navbar对象。您可以在控制器中使用:this.getMyNavbar()。请阅读:现在没有警告..但仍然存在问题。
    // compare with the position
    var ctx = Ext.getCmp('navView');
    var pages = ctx.getInnerItems().length -1;
    if(pages == 5){
        ctx.pop(2);
    }

    //OR compare with the last object
    var ctx = Ext.getCmp('navView');
    var innerElements = ctx.getInnerItems();
    var pages = ctx.getInnerItems().length -1;
    if(innerElements[pages].config.xtype == "myXtypeClass"){
        ctx.pop(2);
    }
if(Ext.getCmp('myView')){
                Ext.getCmp('myView').destroy();
}

//Push myView

where  myView should be the id of that view declared in config of that view


    config: {

        id:'myView',

    }