2015-07-21 45 views
3

我有一個奇怪的情況。我正在寫一個帶左滑動菜單的角度+離子應用程序,下面是我正在嘗試執行的操作:離子+安卓後退按鈕+旁邊菜單是打開檢測 - 無法可靠工作

1)捕獲Android後退按鈕 2)當您點擊後退按鈕時,如果菜單未打開,帶你到菜單(打開它) 3)如果菜單是打開的,你點擊後退按鈕,退出應用程序

要陷阱後退按鈕,我有這個代碼在app.run(也試圖搬遷到基地控制器和注入$控制器到其他控制器,沒有什麼區別)

我注意到,如果我實際點擊菜單的「菜單圖標」,「isOpen」可靠地打印真實/ false作爲我打開和關閉菜單

但是,當我點擊Android後退按鈕,它的作品第一次(打印真或假),但每一個後來的水龍頭不會改變isOpen狀態,而菜單實際上切換。

因此,這使我無法以編程方式檢測菜單是否在android後退按鈕處理程序中打開或關閉。

這讓我感到困惑,爲什麼這只是Android後臺處理程序中的一個問題,當我點擊菜單項時不是問題。它被稱爲在兩種情況下相同的代碼,這是

$ionicSideMenuDelegate.toggleLeft(); 

我的Android處理代碼:

$ionicPlatform.registerBackButtonAction(function (event) { 
      $ionicSideMenuDelegate.toggleLeft(); 
     $ionicSideMenuDelegate.$getByHandle('sideMenu').toggleLeft(); 
      $timeout (function() { 
      console.log ("Status of SIDE MENU IS : " + $ionicSideMenuDelegate.$getByHandle('sideMenu').isOpen()); 
      },1000); 

}, 100); 

我還設置了一個codepen,但不知道如何可以在測試和android設備,因爲每次我嘗試點擊codepen或jsfiddle中的後退按鈕時,都會使瀏覽器返回頁面。

任何洞察發生了什麼?我曾在離子論壇上發過帖,但一直未能發現爲什麼(還) - >因此,希望SO社區能夠傳播給更多的觀衆。

回答

7

registerBackButtonAction需要priority覆蓋其他操作:對現有的後退按鈕鉤

優先級如下: 返回前一視圖= 100關閉側菜單= 150辭退模態= 200關閉action sheet = 300 Dismiss popup = 400 Dismiss loading overlay = 500

您的後退按鈕操作將覆蓋上述每個優先級低於您提供的優先級的操作。例如,分配101優先級的動作 將覆蓋「返回到先前視圖」 操作,但不會執行任何其他操作。

我測試過此代碼,它按預期工作:

.run(function($ionicPlatform, $ionicSideMenuDelegate, $ionicPopup) { 
     $ionicPlatform.registerBackButtonAction(function(e) { 
      e.preventDefault(); 
      if (!$ionicSideMenuDelegate.isOpenLeft()) { 
       $ionicSideMenuDelegate.toggleLeft(); 
      } else { 
       navigator.app.exitApp(); 
      } 
     }, 1000); 
}); 

正如你可以看到我使用的優先級1000,以確保我重寫所有默認操作。

我也用過preventDefault()。我不認爲你需要這個,但以防萬一。

這段代碼僅適用於左側菜單,我只檢查:

$ionicSideMenuDelegate.isOpenLeft() 

,只有打開左邊的一個:

$ionicSideMenuDelegate.toggleLeft() 

,但你可以改變它一起工作right菜單也是如此。

UPDATE

如果有人有興趣瞭解更多有關Android和後退按鈕,這是目前爲止我讀過的最好article

+0

我對延遲響應表示歉意。是的,這很好 - 只是測試它!非常感謝 – user1361529

+0

很高興它的工作。乾杯。 – LeftyX

+0

這個代碼只能在app.run中使用嗎?還是我可以在任何控制器中使用它? –