2012-01-09 73 views
1

我有一个Ext.navigation.View,其中推送了一些视图。某些用户交互要求我直接回到导航视图的顶层 - 相当于iOS上的UINavigationController上的popToRootViewControllerAnimated:。Sencha Touch Ext.navigation.View弹出至根目录

我已经试过像各种各样的事情:

while(navigationView.getItems().getCount() > 1) 
    navigationView.pop(); 

while(navigationView.canPop()) 
    navigationView.pop(); 

既不工作。第一个例子似乎让我陷入了一个无限循环,这并不令人感到意外。第二个例子似乎只弹出一个视图。

所以问题:在Sencha Touch的Ext.navigation.View(版本2开发人员预览版)中弹出到根视图的正确方法是什么?

回答

9

已经有许多用于实现该临时方法。

我正在使用的是弹出一个数字比你曾经拥有过的水平的数量更高,

navigationView.pop(10); 

,并且工作得很好,但我从来没有满意了,但我看到他们现在已经推出了复位方法。您可以在煎茶源代码中内部调用从而...

navigationView.reset(); 

(见下文),你可以看到它做了类似的工作,以什么@Mithralas说,只是更容易编写。

// From the Sencha source code 
this.pop(this.getInnerItems().length); 
1

溶液原来是用下面的延伸导航视图:

popToRoot: function(destroy) 
{ 
    var navBar = this.getNavigationBar(), 
    stackLn = this.stack.length, 
    stackRm; 

    //just return if we're at root 
    if(stackLn <= 1) return; 
    //just return if we're already animating 
    if(navBar && navBar.animating) return; 

    //splice the stack to get rid of items between top and root 
    stackRm = this.stack.splice(1, stackLn-2); 
    //remove views that were removed from the stack if required 
    if(destroy) { 
     stackRm.forEach(function(val, idx, arr) { 
      this.remove(val, true); 
     }); 
    } 
    //clear out back button stack 
    navBar.backButtonStack = []; 
    //now we can do a normal pop 
    this.pop(); 
} 
+0

我在Sencha的论坛发布了这个问题,它让我回答有一种方法可以将活动项目设置为root,但不会修改视图堆栈。 正是在这一点上,我决定添加自己的例程来做到这一点。我在Sencha论坛上发布了我的解决方案,并希望他们将这个功能添加到Sencha Touch 2.0 – mwu 2012-01-11 16:19:37

+0

从Sencha Touch 2开始,你可以说this.pop(this.getItems()。length); – 2012-03-28 10:41:25

+0

是的。他们补充说,在我将解决方案发布给他们之后,并要求默认包含类似的功能。 – mwu 2012-05-10 17:19:35

7
popToRoot: function() { 
    this.pop(this.getItems().length - 1); 
} 
+0

在我写这个问题的时候,这段代码在最新的开发人员预览版中无法使用。由于这是现在正确的做法,我正在改变我接受的答案。 – mwu 2012-05-10 17:23:17

+5

正确的做法是从2.0开始 navigationView.reset() – 2012-06-26 15:54:52

2

确保使用NavigationView.reset()方法。为了清楚起见,如果你的主导航视图是Main,你可以在控制器中这样做:

this.getMain()。reset();