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',
}