【问题标题】:how to restore ionic backbutton after override? - breaking backbutton on other tabs覆盖后如何恢复离子后退按钮? - 打破其他标签上的后退按钮
【发布时间】:2017-04-01 13:09:50
【问题描述】:

当前,特定页面上的后退按钮覆盖正在处理我正在应用的特定 Tab-SubTab (A) - 在 SubTabA 上,后退按钮将我带回 TabA,但 $scope.$on('$破坏......)似乎没有工作。因为如果从 Tab-SubTab(A) 并且我直接导航到另一个 Tab-SubTab (C) 页面 - Tab-SubTab (C) 上的后退按钮将我直接带回 TabA 而不是返回 TabC。

此外,如果我回到 TabC - 它会直接带我进入 Tab-SubTabC(因为那是它上次停止的地方),我永远无法回到 TabC。

下面是我所在的特定页面/选项卡的控制器:

  $scope.$on('$ionicView.beforeEnter', function(){
      // some none related stuff here.
  }) ;
  // custom back button to send user to master Rides tab no matter how many subviews they navigate to
  //
  //
  var doCustomBack = function() {
      $state.transitionTo('tab.rides');
  };
  // override soft back
  // framework calls $rootScope.$ionicGoBack when soft back button is pressed
  var oldSoftBack = $rootScope.$ionicGoBack;
  $rootScope.$ionicGoBack = function() {
      doCustomBack();
  };
  var deregisterSoftBack = function() {
      $rootScope.$ionicGoBack = oldSoftBack;
  };
  // override hard back
  // registerBackButtonAction() returns a function which can be used to deregister it
  var deregisterHardBack = $ionicPlatform.registerBackButtonAction(
      doCustomBack, 101
  );
  // cancel custom back behaviour
  $scope.$on('$destroy', function() {
      deregisterHardBack();
      deregisterSoftBack();
  });

我认为 $scope.$on('$destroy'...) 可以防止这种情况发生,但显然不是。

导航视觉:

Tab A (controller: tabA)
   -> Sub Tab A1 (controller: subTabA)  <- above backbutton overrides here
Tab B (controller: tabB)
   -> Sub Tab B1 (controller: subTabB)
Tab C (controller: tabC)
   -> Sub Tab C1 (controller: subTabC)
Tab D (controller: tabD)

我的应用顶部是

HOME    TabA     TabB     TabC     TabD

If I got to TabA -> SubTabA, click back button, takes me back to TabA
If I got to TabA -> SubTabA, then go directly to TabC (from top of app) then to -> SubTabC, 
the back button on SubTabC takes me directly back to TabA content.

【问题讨论】:

    标签: angularjs ionic-framework tabs back-button


    【解决方案1】:

    问题是在状态改变之前 $destroy 没有足够快地触发。所以搬到这里:

    1. 将:var oldSoftBack = $rootScope.$ionicGoBack 更改为:

    $rootScope.oldSoftBack = $rootScope.$ionicGoBack ;

    1. 用这个代替$scope.$on('$destroy'...)

    var backStateChangeWatcher = $rootScope.$on('$stateChangeStart', function () {
      if($rootScope.oldSoftBack){
        deregisterHardBack();
        deregisterSoftBack();
        // Un-register watcher
        backStateChangeWatcher();   
      }
    }) ;

    【讨论】:

    • 嗨!我有同样的问题。我已经尝试过你的修复,但我仍然可以重现它。你能看看我的snippet吗?也许你会注意到一个问题。提前致谢!
    • 参考这个帖子,我想你需要的一切都在这里(因为你将方法部署为服务)。 stackoverflow.com/questions/32231737/…
    猜你喜欢
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多