2016-01-20 71 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