2015-02-12 56 views
0

我已经注册了我的控制器内的硬件后退按钮事件registerBackButtonAction和使用$destroy事件注销事件。但是当我导航到不同的页面(状态)时,事件没有被调用。我错过了什么?

.controller('HomeCtrl', function($scope, $ionicPlatform, $location, $rootScope, $http) { 
    // Register hardware back button 
    var deregister = $ionicPlatform.registerBackButtonAction(function (event) { 
    navigator.app.exitApp(); 
    return; 
    }, 100); 

    console.log('scope on'); 
    $scope.$on('$destroy', function() { 
    console.log('destroy called'); 
    deregister(); 
    }) 
}) 

在控制台中我看不到destroy called。请帮我解决这个问题。

更新: 在浏览器中,当我从家庭导航到登录时,Home中的元素仍然存在于浏览器中。我想这就是为什么摧毁不被调用的原因。所以问题是我应该手动触发事件,还是应该将主页实际销毁,当我移动到登录?

这里是我的index.html

<!DOCTYPE html> 
<html> 
    <head> 
    <meta charset="utf-8"> 
    <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width"> 
    <title></title> 
    <link href="http://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css" rel="stylesheet"> 
    <link href="css/ionic.app.css" rel="stylesheet"> 
    <link href="css/style.css" rel="stylesheet"> 
    <!-- ionic/angularjs js --> 
    <script src="lib/ionic/js/ionic.bundle.js"></script> 
    <!-- cordova script (this will be a 404 during development) --> 
    <script src="cordova.js"></script> 
    <!-- Push notification --> 
    <script src="js/PushNotification.js"></script> 
    <!-- Geo location --> 
    <script type="text/javascript" src="http://maps.google.com/maps/api/js?v=3&sensor=false&language=en"></script> 
    <!-- app js --> 
    <script src="js/app.js"></script> 
    <script src="js/controllers.js"></script> 
    </head> 
    <body ng-app="starter" ng-controller="AppCtrl"> 
    <ion-nav-view></ion-nav-view> 
    </body> 
</html> 

页在app.js通过模板加载状态的一部分:

.state('app.login', { 
    url: "/login", 
    views: { 
     'menuContent': { 
     templateUrl: "templates/login.html", 
     controller: 'LoginCtrl' 
     } 
    } 
    }) 

    .state('app.home', { 
    url: "/home", 
    views: { 
     'menuContent': { 
     templateUrl: "templates/home.html", 
     controller: 'HomeCtrl' 
     } 
    } 
    }) 
+1

能否请您告诉我们您的HTML。也许导航$ scope不会被销毁,因为范围所属的元素不会被删除。 – lujcon 2015-02-12 08:39:52

+2

这看起来完全正确,但是有一种情况你必须自己触发destoy事件,也就是说,如果你在transcluded元素中有控制器指令。是这样吗? – jornare 2015-02-12 08:40:20

回答

1

感谢您的帮助球员。在我的框架中,第一个加载页面的元素不会被删除,因此不会调用$destroy。解决方法是使用事件$ionicView.leave注销所以,与其

$scope.$on('$destroy', deregister); 

使用:

$scope.$on('$ionicView.leave', deregister); 

完整代码:

.controller('HomeCtrl', function($scope, $ionicPlatform, $location, $rootScope, $http) { 
    // Register hardware back button 
    var deregister = $ionicPlatform.registerBackButtonAction(function (event)   { 
    navigator.app.exitApp(); 
    return; 
    }, 100); 

    $scope.$on('$ionicView.leave', deregister); 
}) 
0

我应该在包装注销()匿名功能。然后它为我工作。

var deregister = $ionicPlatform.registerBackButtonAction(function() { 
    $state.go('app.start'); 
}, 100); 

$scope.$on('$ionicView.leave', function() { 
    deregister(); 
}); 
0

这项工作对我来说

var deregister = null; 

$scope.$on('$ionicView.enter', function(){ 
    deregister = $ionicPlatform.registerBackButtonAction(
     function() { 
       navigator.Backbutton.goHome(function() { 
        console.log('hidden'); 
       }, function() { 
        navigator.app.exitaApp(); 
       }); 
     }, 100 
    );  
}) 
$scope.$on('$ionicView.leave', function() { 
    deregister(); 
});