0

在我的 AngularJs 和 phonegap/cordova 应用程序中,我监听后退按钮事件。然后我将它广播到我的app.js中的某些控制器:

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

在某些视图中,我想听听这个,以便我可以通知用户他们将退出应用程序并让他们选择继续或不继续。

所以有两个控件,大厅和游戏。

当用户在大厅中点击返回时,他们应该会看到一条通知,告诉他们他们将退出应用程序:

$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
    );
});

我看到的问题是,当我在游戏中时,当我单击返回按钮时,我会看到两个通知。一个用于正确的游戏,然后另一个用于不需要的大厅。

所以这并不是一个真正的缺陷,它应该是这样工作的,但是对于 Angular 来说相对较新,我不确定最好的方法,因为在这里广播似乎不合适。

4

1 回答 1

1

$rootScope.$broadcast是因为该方法暗示了一种广播机制。无论在哪里声明,无论附加什么侦听器都将在广播中被触发。

要修复它,您必须首先确定在加载控制器lobby时是否应该加载相关的game控制器。如果游戏和大厅的视图不同并且不在同一个父视图中,那么当您处于游戏视图时,大厅控制器不应保持加载状态。这是典型的内存泄漏。

如果它们都应该存在,那么在您的处理方法中on,您需要根据上下文决定要触发哪个事件处理程序。您可以使用$route$location服务做出此决定,它提供当前正在使用的 url\view (ng-view)。

于 2013-10-18T04:35:21.827 回答