【问题标题】:Angular service is not initializingAngular 服务未初始化
【发布时间】:2015-09-15 00:41:27
【问题描述】:

我有一项服务检查用户身份验证以重定向到登录或登录区域。

services.js:

var servicesModule = angular.module('servicesModule', []);

servicesModule.service('loginService', ['$state', function($state){

    console.log('Inside');

    var ref = new Firebase("https://feedback-system.firebaseio.com/");
    var authData = ref.getAuth();

    console.log('Inside');

    if (authData) {


      $state.go('tabs.courses');
      console.log("User " + authData.uid + " is logged in with " + authData.provider);

    } else {

      $state.go('login');
    }

}]);

控制器:

var ionicApp = angular.module('feedback-system', ['ionic', 'firebase', 'servicesModule', 'coursesModule', 'feedbackModule', 'loginModule', 'tabsModule']);

ionicApp.run(function($ionicPlatform, $state) {
  $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.Keyboard) {
      cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
    }
    if(window.StatusBar) {
      StatusBar.styleDefault();
    }
  });
});

ionicApp.config(function($stateProvider, $urlRouterProvider) {
  $stateProvider

  .state('login', {
    url: '/login',
    templateUrl: 'views/login.html',
    controller: 'loginCtrl'
  })

  .state('tabs', {
    url: '/tabs',
    abstract: true,
    templateUrl: 'views/main.html',
    controller: 'tabsCtrl'
  })

  .state('tabs.courses', {
    url: '/courses',
    views:{
      'coursesView':{    
        templateUrl: 'views/courses.html',
        controller: 'coursesCtrl'
      }
    }
  })

  .state('tabs.feedback', {
    url: '/feedback',
    views:{
      'feedbackView':{
        templateUrl: 'views/feedback.html',
        controller: 'feedbackCtrl'
      }
    }
  })

  .state('tabs.notifications', {
    url: '/notifications',
    views:{
      'notificationsView':{
        templateUrl: 'views/notification.html',
        controller: 'notificationCtrl'
      }
    }
  });

  $urlRouterProvider.otherwise("/courses");
});

index.html:

<!DOCTYPE html>
<html ng-app="feedback-system">
  <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="lib/ionic/css/ionic.css" rel="stylesheet">
    <link href="css/style.css" rel="stylesheet">

    <!-- IF using Sass (run gulp sass first), then uncomment below and remove the CSS includes above
    <link href="css/ionic.app.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="lib/ngcordova/dist/ng-cordova.js"></script>
    <script src="cordova.js"></script>

    <!-- Firebase -->

    <script src="https://cdn.firebase.com/js/client/2.2.7/firebase.js"></script>
    <script src="lib/angularfire.min.js"></script>

    <!-- Services -->

    <script src="js/services/services.js"></script>

    <!-- Controllers -->

    <script src="js/controllers/loginCtrl.js"></script>
    <script src="js/controllers/coursesCtrl.js"></script>
    <script src="js/controllers/feedbackCtrl.js"></script>
    <script src="js/controllers/tabsCtrl.js"></script>

    <!-- Application -->

    <script src="js/app.js"></script>

  </head>
  <body>
    <ion-nav-view></ion-nav-view>    
  </body>
</html>

我将它注入到 app.js 主模块和 index.html 中,完全没有错误,但什么也没发生,控制台中也没有任何日志记录。 知道为什么没有执行这个 servies.js 吗?

更新:

对不起,我忘了提到这项服务的工作方式与现在完全一样,之前没有任何回报,它今天只是停止工作。

【问题讨论】:

    标签: javascript angularjs ionic-framework ionic angularjs-service


    【解决方案1】:

    这样做,

    var servicesModule = angular.module('servicesModule', []);
    
    servicesModule.service('loginService', ['$state', '$firebaseAuth', '$firebase',  function($state,$firebaseAuth ,$firebase ){
    
    return function() {
        console.log('Inside');
    
        var ref = new Firebase("https://feedback-system.firebaseio.com/");
        var authData = $firebaseAuth(ref);
    
        console.log('Inside');
    
        if (authData) {
    
    
          $state.go('tabs.courses');
          console.log("User " + authData.uid + " is logged in with " + authData.provider);
    
        } else {
    
          $state.go('login');
        }
    }
    }]);
    

    注入$firebaseAuth$firebase 并尝试。您还可以显示控制器以及如何在 index.html 中注入此服务吗?

    【讨论】:

    • 我没有添加控制器,因为它有点长,而且我认为没有必要添加控制器,因为服务在应用程序运行时至少执行一次,我会尝试你建议的解决方案,但我的意思是甚至第一行 console.log 也没有运行,所以这意味着根本看不到服务。
    • 一定要尝试注入$firebaseAuth$firebase 如上所述。哦,我没有意识到一个基本的事情,你必须从服务中返回一些东西,这就是目的和设计!我将修改我的答案
    • 服务的目的是在你进入你的视图之前执行一些事情,其中​​一个用途是让一些数据准备好供控制器使用。我之前已经成功地运行过这个服务,它现在完全是这样,它今天只是停止执行。
    • 听起来很奇怪!这很有趣
    • @JoshBeam 谢谢.. 抱歉打错了.. 在印度太晚了 :D 谢谢.. 干杯!
    【解决方案2】:

    我认为您的服务声明出错了。将服务内的内容包装在一个返回函数块中。

    servicesModule.service('loginService', ['$state', function($state){
    
        return function() {
            console.log('Inside');
    
            var ref = new Firebase("https://feedback-system.firebaseio.com/");
            var authData = ref.getAuth();
    
            console.log('Inside');
    
            if (authData) {
    
    
              $state.go('tabs.courses');
              console.log("User " + authData.uid + " is logged in with " + authData.provider);
    
            } else {
    
              $state.go('login');
            }
        }
    
    }]);
    

    在控制器中

    servicesModule.controller('loginController', ['$scope', 'loginService', function($scope, loginService){
    
           loginService();
    
    }]);
    

    【讨论】:

    • 你不返回服务中的函数,工厂用于我认为,如果我错了,请纠正我
    • @Faizan,工厂返回你想要的任何东西(数组、函数、普通对象、字符串)。服务返回 new'ed 函数。这个答案是正确的。
    猜你喜欢
    • 2018-02-22
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 2018-12-24
    • 1970-01-01
    相关资源
    最近更新 更多