2017-09-10 7 views
0

私は2つのモジュールを接続する必要があります。 mainPageと呼ばれるメインモジュールには、ルータと呼ばれる第2のモジュールが組み込まれています。それらは別々のファイルにあります。私はmainPAGEとルータでuserPropagatorServiceというサービスを使いたいと思っています。 このサービスは、現在ログインしているユーザーを取得および設定するために使用する必要があります。 ルータモジュールにサービスを注入しようとしましたが、エラーが発生します。 これをどうすれば実現できますか?複数のモジュールでサービスを使用するAngularJS

メインページファイル:

var app = angular.module('mainPage',['reg','router']); 

//Returns a promise which generates our user. 
app.factory('userLoginService',['$http',function ($http){ 

    return{ 
    loginService: function(username,password){ 

     var info = {username:username, password:password} 

     var user={}; 

     //Returning http request because of promises 
     return $http({ 

      url: 'webapi/users/login', 
      method: 'POST', 
      data: info, 
      headers: { 
       'Content-Type': 'application/x-www-form-urlencoded' 
      }, 
      transformRequest: function(obj) { 
       var str = []; 
       for(var p in obj) 
       str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p])); 
       return str.join("&"); 
      }, 
      data:{username: info.username, password: info.password} 

     }).then(function (response) 
     { 

      user = response.data 
      return user; 

     }); 

    } 
    } 
}]); 


app.service('userPropagatorService', function(){ 

    return{ 

     get:function(){ 

      return this.u; 
     }, 

     set:function(user){ 

      this.u = user; 

     } 
    } 

}); 

ルータファイル:

var r = angular.module('router',['ngRoute']) 
    .config(['$routeProvider', '$locationProvider','userPropagatorService', 
     function($routeProvider, $locationProvider, userPropagatorService) { 

     $locationProvider.html5Mode(true); 

     $routeProvider 
     .when("/home",{ 
      templateUrl: "pages/MainPage.html", 
      controller:"homeController" 
     }) 
     .when("/forums",{ 
      templateUrl: "pages/forumsPage.html", 
      controller:"forumController" 
     }) 
     .when("/topics",{ 
      templateUrl: "pages/topicsPage.html", 
      controller:"topicsController" 
     }) 
     .when("/comments",{ 
      templateUrl: "pages/commentsPage.html", 
      controller:"commentsController" 
     }) 
     .otherwise({ 
      redirectTo:"/home" 
     }); 
    }]) 

    .controller("homeController",['$scope','$http',function($scope,$http){ 

     /*$http({ 
      url: "webapi/forums/all", 
      method:"GET" 
     }) 
     .then(function(response){ 
      console.log("YEA!"); 
      console.log(response.data); 
     }, 
     function(response){ 
      console.log("NO:("); 
     })*/ 

     $scope.username = "visitor!" 
     $scope.user = userPropagatorService.get(); 
     if($scope.user != null){ 
      $scope.username=$scope.user.username + "!"; 
     } 

    }]) 
    .controller("forumController",['$scope','$http',function($scope,$http){ 

     $scope.username = "visitor!" 

    }]) 
    .controller("commentsController",['$scope','$http',function($scope,$http){ 

     $scope.username = "visitor!" 

    }]); 
+0

をもの、私が疑われるのカップルがあります。 1. 'userLoginService'は' mainPage'モジュールの一部です。 'router'の中では利用できません(共通のコンポーネントを持つseparte' common'モジュールを作成することをお勧めします)2.サービス/ファクトリは 'config'ブロックの中に挿入されません。サービスよりもプロバイダを作成する(それはあなたが扱っている状況に依存します)サービスを利用できるように 'resolve'を使うことができるかもしれません。 –

+0

サービスは設定ブロックに挿入できません。 Docs:* Configurationブロックから - プロバイダの登録と設定フェーズで実行されます。構成ブロックにはプロバイダと定数だけを注入できます。これは、完全に構成される前に誤ってサービスがインスタンス化されるのを防ぐためです。詳細については、「AngularJS開発者ガイド - モジュール読み込みと依存関係」(https://docs.angularjs.org/guide/module#module-loading-依存関係)。 – georgeawg

+0

@PankajParkar私はプロバイダを使用することはできません、それはまったく役に立ちません。私は共通のモジュールを作成しようとしましたが、それでも他のモジュールはpropagatorServiceを見ることができません。 – Riki

答えて

1

あなたはrouterモジュールでuserLoginServiceを使用したい場合は、メインアプリの外に壊れする必要があります。

var app = angular.module('mainPage',['reg','router']); 

angular.module("services",[]) 
    .factory('userLoginService',['$http',function ($http){ 

    return{ 
     //Service code here 
    }; 
}]); 

次にrouterモジュールに依存関係として追加:

var r = angular.module('router',['ngRoute','services']) 
+0

これはuserPropagatorServiceにも適用されますか? – Riki

+0

設定ブロックで使用できないという警告があります。 – georgeawg

+0

ありがとう、これは魅力的に機能しました! :) – Riki

0

あなたはconfigブロックにサービス "userPropagatorServiceを" 注入傾けます。 そこから$ methodとreturn関数を持つプロバイダにします。

ang.provider('userPropagatorService', function(){ 
    return{ 
      get:function(){ 
         console.log("in get"); 
     }, 
      set:function(user){ 
      }, 
      $get: function(){ 
        return { 
         meth1: function(){ 

         } 
        } 
      } 
    } 
}); 

ang.config(function(userPropagatorServiceProvider){ 
    console.log(userPropagatorServiceProvider.meth1()) 
}) 
関連する問題