无法在window.onnotification中使用rootScope

时间:2016-05-16 19:28:20

标签: javascript angularjs ionic-framework

我正在尝试将rootScope用作全局,以便可以在控制器中检索它。

app.js:

angular.module('app', ['ionic', 'app.controllers', 'app.routes', 'app.services', 'app.directives'])
.run(function($ionicPlatform,$rootScope) {
  $ionicPlatform.ready(function() {
    // Hide the accessory bar by default (remove this to show the accessory bar above the keyboard
    // for form inputs)
    if (window.cordova && window.cordova.plugins && window.cordova.plugins.Keyboard) {
      cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
      cordova.plugins.Keyboard.disableScroll(true);
    }
    if (window.StatusBar) {
      // org.apache.cordova.statusbar required
      StatusBar.styleDefault();
    }

    pushNotification = window.plugins.pushNotification;
    pushNotification.register(
    onNotification,
    errorHandler,
  {
    'badge': 'true',
    'sound': 'true',
    'alert': 'true',
    'ecb': 'onNotification',
    'senderID': '999999999999',
  }
    );


  });
})

window.onNotification = function(e){

      switch(e.event){
        case 'registered':
          if(e.regid.length > 0){

            var device_token = e.regid;

              alert('registered :'+device_token);
              $rootScope.devicetoken = device_token;

          }
        break;

        case 'message':
          alert('msg received: ' + e.message);
          break;

        case 'error':
          alert('error occured');
        break;

      }
};

window.errorHandler = function(error){
  alert('an error occured');
}

我正在获取device_token并进入警戒状态。但它不会进入rootScope内部以在控制器中使用它。

Controller.js:

angular.module('app.controllers', [])

.controller('onWalletWelcomesCtrl', function($scope, $ionicModal,User,$ionicLoading,$rootScope) {

    $ionicModal.fromTemplateUrl('signup-modal.html', {
      id: '1', // We need to use and ID to identify the modal that is firing the event!
      scope: $scope,
      backdropClickToClose: false,
      animation: 'slide-in-up'
    }).then(function(modal) {
      $scope.oModal1 = modal;
    });

    $scope.proceed = function(){
        alert($rootScope.devicetoken);
        $ionicLoading.show({template: '<ion-spinner icon="android"></ion-spinner>'});

    }

})

我在提交函数中发出警报时未定义。 我应该如何在window.onNotification中使用rootScope。我的主要目的是将devicetoken传递给控制器​​。请让我分享变量的最佳做法。

angular.module('app', ['ionic', 'app.controllers', 'app.routes', 'app.services', 'app.directives'])
.run(function($ionicPlatform,$rootScope) {
  $ionicPlatform.ready(function() {

    if (window.cordova && window.cordova.plugins && window.cordova.plugins.Keyboard) {
      cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
      cordova.plugins.Keyboard.disableScroll(true);
    }
    if (window.StatusBar) {
      // org.apache.cordova.statusbar required
      StatusBar.styleDefault();
    }

    pushNotification = window.plugins.pushNotification;
    pushNotification.register(
    onNotification,
    errorHandler,
  {
    'badge': 'true',
    'sound': 'true',
    'alert': 'true',
    'ecb': 'onNotification',
    'senderID': '9999999999',
  }
    );

  });
})

window.onNotification = function(e){

      switch(e.event){
        case 'registered':
          if(e.regid.length > 0){

            var device_token = e.regid;

            alert('registered :'+device_token);
            $rootScope.devicetoken = "hi";
            $scope.$apply();

          }
        break;

        case 'message':
          alert('msg received: ' + e.message);

        break;

        case 'error':
          alert('error occured');
        break;

      }
};

window.errorHandler = function(error){
  alert('an error occured');
}

在控制器发出警报时,我仍然未定义。

3 个答案:

答案 0 :(得分:0)

您需要在window.onNotification = function(e){..}阻止内移动.run(function($ionicPlatform,$rootScope) {...}声明。

$ rootScope将在您当前放置的onNotification处理程序中未定义 - 您需要在run()块内声明onNotification处理程序,以便在定义时可以访问rootScope对象。

另外,因为您将使用一个生活在角度生命周期之外的事件处理程序更新rootScope(角度不知道它),您需要手动调用触发新的摘要周期。在通知处理程序中,您需要使用$ rootScope.apply()包装$rootScope.devicetoken = device_token;行,以便它看起来像这样:

$rootScope.apply(function(){
      $rootScope.devicetoken = device_token;
});

答案 1 :(得分:0)

您在window.onNotification中使用$ rootScope,因此它不是角度上下文,因此您需要告诉angular进行更新。 因此,您需要在$scope.$apply();更新后添加$rootScope

答案 2 :(得分:-1)

尝试在运行范围

上定义$ rootScope.devicetoken
.run(function($ionicPlatform,$rootScope) {
    $rootScope.devicetoken = '';

确保在$ scope.proceed

之前执行window.onNotification