2016-01-20 70 views
0

一直努力嘗試訪問我的路由器配置中的依賴關係,最後幾小時一直在努力,看着提供商,但似乎無法理解他們將如何幫助我。長話短說:我有一個名爲'ngOpenFB'的模塊,我需要能夠在我的路由器模塊的配置中訪問上述模塊。Angular 1.x,在配置中注入依賴關係

我需要訪問'ngOpenFB'模塊以在state.resolve中使用它,檢查用戶是否在允許基本重新路由之前登錄。

下面是我希望能夠訪問ngFB,當然我知道我不能,但是有什麼可能的解決方案和最佳實踐?

編輯:我知道我可以使用偵聽器來檢查$ stateChangeStart並劫持路由更改事件,原因很多,這將是我的最後手段。

angular.module('app.routes', ['ngOpenFB']) 

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

    var loginRequired = function ($q, $location) { 
     var deferred = $q.defer(); 
     deferred.resolve(); 

     // HERE I NEED TO ACCESS THE MODULE 
     if (ngFB.getLoginStatus().$$state.value.status !== 'connected') { 
      $location.path('/nologin'); 
     } 

     return deferred.promise; 
    }; 


    $stateProvider.state('start', { 
     url: '/start', 
     templateUrl: 'templates/start.html', 
     controller: 'startCtrl', 
     resolve: loginRequired 
    }) 

    $urlRouterProvider.otherwise('/start'); 
}); 

編輯2:ngOpenFB模塊

angular.module('ngOpenFB', []) 

    .factory('ngFB', function ($q, $window) { 

     function init(params) { 
      return $window.openFB.init(params); 
     } 

     function login(options) { 
      var deferred = $q.defer(); 
      $window.openFB.login(function(result) { 
       if (result.status === "connected") { 
        deferred.resolve(result); 
       } else { 
        deferred.reject(result); 
       } 
      }, options); 
      return deferred.promise; 
     } 

     function logout() { 
      var deferred = $q.defer(); 
      $window.openFB.logout(function() { 
       deferred.resolve(); 
      }); 
      return deferred.promise; 
     } 

     function api(obj) { 
      var deferred = $q.defer(); 
      obj.success = function(result) { 
       deferred.resolve(result); 
      }; 
      obj.error = function(error) { 
       deferred.reject(error); 
      }; 
      $window.openFB.api(obj); 
      return deferred.promise; 
     } 

     function revokePermissions() { 
      var deferred = $q.defer(); 
      $window.openFB.revokePermissions(
       function() { 
        deferred.resolve(); 
       }, 
       function() { 
        deferred.reject(); 
       } 
      ); 
      return deferred.promise; 
     } 

     function getLoginStatus() { 
      var deferred = $q.defer(); 
      $window.openFB.getLoginStatus(
       function(result) { 
        deferred.resolve(result); 
       } 
      ); 
      return deferred.promise; 
     } 

     return { 
      init: init, 
      login: login, 
      logout: logout, 
      revokePermissions: revokePermissions, 
      api: api, 
      getLoginStatus: getLoginStatus 
     }; 

    }); 
+0

是你的ngOpenFB提供者嗎? – Aer0

+0

不,這是一個模塊 –

+0

對不起,錯誤的問題。不知道您是否在控制檯中遇到錯誤。我只是很好奇ngFB,如果它是一個提供者,因爲你只能將提供者注入你的配置。 – Aer0

回答

0

由於一些結構,我張貼此作爲一個答案。

AngularJS中的配置塊只接受providers,提供者也是如此 - 這些也只接受提供。所以結論是,您只能將provider注入provider/config

你可以閱讀更多關於here,在模塊加載&依賴關係

模塊是配置和運行塊的集合,其獲得在引導過程中施加到應用 。在其最簡單的 形成模塊有二種的 塊的集合:

  1. 配置塊 - 在供應商登記和配置階段得到執行。只有提供者和常量 可以注入到配置塊中。這是爲了防止 在完全配置完成 之前意外實例化服務。
  2. 運行塊 - 在創建注入器後執行並用於啓動應用程序。只有實例和常量可以注入到運行塊中 。這是爲了防止在應用程序運行時進一步配置系統 。

這意味着,你將不得不編寫你自己的提供者,你可以注入你的配置。

另一種選擇是使用模塊的運行模塊。但在你的情況下,這是不可能的,因爲你試圖用動態生成的數據填充你的$stateProvider