2013-10-18 73 views
0

在我AngularJs和PhoneGap的/科爾多瓦應用程序,我聽後退按鈕事件。

document.addEventListener("deviceready", function(){ 
    document.addEventListener('backbutton', function(){ 
     $rootScope.$broadcast('backButton'); 
    }, false); 
}, false); 

在某些觀點我想聽聽這個,這樣我可以告知,他們將退出應用程序的用戶,並給他們的選項:然後我就app.js內廣播這個特定的控制器繼續與否。

所以有兩個控件,大廳和遊戲。

當用戶單擊回到了大廳,他們應該看到一個通知,告訴他們,他們將退出應用程序:

$rootScope.$on('backButton', function(event){ 

    $window.navigator.notification.confirm(
     'Are you sure you want to exit app?',  // message 
     $scope.exitApp,        // callback to invoke 
     'APP',         // title 
     ['OK', 'Cancel']       // button labels 
    ); 

如果他們點擊確定他們是從應用程序註銷並重新定向到登錄屏幕。

當他們是他們應該被告知他們將放棄他們的遊戲,然後重定向到大廳遊戲顯示:

$rootScope.$on('backButton', function(event){ 
    $window.navigator.notification.confirm(
     'Are you sure you want to quit your game?',  // message 
     $scope.quitGame,        // callback to invoke 
     'GAME',          // title 
     ['OK', 'Cancel']        // button labels 
    ); 
}); 

我看到的問題是,當我在比賽中我看到當我點擊後退按鈕時這兩個通知。一個是正​​確的遊戲,另一個是不需要的大廳。

所以這是不是一個真正的缺陷,這是應該如何工作,但作爲相對較新的角度,我不知道最好的方法的廣播似乎不妥這裏。

回答

1

$rootScope.$broadcast是因爲該方法意味着廣播機構。無論聽衆是誰,都會因廣播而被解僱,無論他們是在哪裏宣佈。

要修復它,您必須首先確定當加載game控制器時,與lobby相關的控制器是否應該實際加載。如果遊戲和大廳的視圖不同且不在同一父視圖中,則當您處於遊戲視圖時,大廳控制器不應保持加載狀態。這是一個典型的內存泄漏。

如果他們都應該存在,那麼在on你需要決定基於上下文觸發該事件處理程序的處理方法。您可以使用$route$location服務作出此決定,該服務提供當前正在使用的url \ view(ng-view)。

+0

嗨,是我用$ location.path()方法按你的建議。 兩個控制器不需要同時加載。 – RyanP13

+0

然後,您不應該要求執行任何檢查。這可能是內存泄漏問題。 – Chandermani

+0

不知道發生了什麼,但我注意到板聽衆,檢查後按鈕事件偵聽器只被綁定一次,但仍然我重複通知。所以如果我退出應用程序一次,會有兩個通知,然後如果我再次退出,三個通知等。 這將指向事件監聽器被重新綁定,但它顯然不是! – RyanP13