AngularJS - 向控制器发送的广播消息会生成重复的通知

时间:2013-10-18 02:59:06

标签: javascript events angularjs angularjs-scope broadcast

在我的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我不确定最好的方法,因为广播似乎不合适。

1 个答案:

答案 0 :(得分:1)

$rootScope.$broadcast是方法意味着广播机制。无论听众是谁,无论他们在哪里宣布,都会被广播解雇。

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

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