$ destroy事件未在导航中调用

时间:2015-02-12 08:11:39

标签: angularjs cordova ionic

我已在控制器内注册了硬件后退按钮事件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导航到Login时,Home的元素仍然存在于浏览器中。我想这就是为什么破坏不被召唤的原因。所以问题是我应该手动触发事件还是应该在我移动到Login时实际销毁主页?

这是我的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'
      }
    }
  })

3 个答案:

答案 0 :(得分:2)

感谢帮助人员。在我的框架中,不会删除第一个加载页面的元素,因此不会调用$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);
})

答案 1 :(得分:0)

我应该在一个匿名函数中包装deregister()。然后它对我有用。

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

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

答案 2 :(得分: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();
});
相关问题