在我的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我不确定最好的方法,因为广播似乎不合适。
答案 0 :(得分:1)
$rootScope.$broadcast
是方法意味着广播机制。无论听众是谁,无论他们在哪里宣布,都会被广播解雇。
要修复它,您必须首先确定在加载lobby
控制器时是否应该加载与game
相关的控制器。如果游戏和大厅的视图不同并且在同一父视图中不存在,则当您在游戏视图中时,大厅控制器不应保持加载状态。这是典型的内存泄漏。
如果它们都存在,那么在您的处理方法on
中,您需要根据上下文决定触发哪个事件处理程序。您可以使用$route
或$location
服务做出此决定,该服务提供当前正在使用的网址\视图(ng-view)。