Angular 1.x,在配置中注入依赖项

时间:2016-01-20 12:01:27

标签: angularjs

在我的路由器配置中尝试访问依赖项的最后几个小时一直在努力,看着提供商,但似乎无法理解他们将如何帮助我。简而言之:我有一个名为'ngOpenFB'的模块,我需要能够在我的路由器模块的配置中访问所述模块。

我需要访问'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
        };

    });

1 个答案:

答案 0 :(得分:0)

由于某种结构,我将此作为答案发布。

AngularJS中的配置块只接受providers,同样适用于提供者 - 这些也只接受提供。结论是,您只能将provider注入provider/config

您可以在模块加载&中找到有关该here的更多信息。依赖

  

模块是配置和运行块的集合   在引导过程中应用于应用程序。在其中   最简单的形式模块由两种集合组成   块:

     
      
  1. 配置块 - 在提供程序注册和配置阶段执行。只有提供者和常量   可以注入配置块。这是为了防止   在服务完全之前意外实例化服务   配置。
  2.   
  3. 运行块 - 在创建注入器后执行并用于启动应用程序。只有实例和常量才可以   注入运行块。这是为了防止进一步的系统   应用程序运行时的配置。
  4.   

这意味着,您必须编写自己的Provider,您可以将其注入配置中。

另一种选择是使用模块的运行块。但在您的情况下,这是不可能的,因为您尝试使用动态生成的数据填充$stateProvider