在我的路由器配置中尝试访问依赖项的最后几个小时一直在努力,看着提供商,但似乎无法理解他们将如何帮助我。简而言之:我有一个名为'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
};
});
答案 0 :(得分:0)
由于某种结构,我将此作为答案发布。
AngularJS中的配置块只接受providers
,同样适用于提供者 - 这些也只接受提供。结论是,您只能将provider
注入provider/config
。
您可以在模块加载&中找到有关该here的更多信息。依赖强>
模块是配置和运行块的集合 在引导过程中应用于应用程序。在其中 最简单的形式模块由两种集合组成 块:
- 配置块 - 在提供程序注册和配置阶段执行。只有提供者和常量 可以注入配置块。这是为了防止 在服务完全之前意外实例化服务 配置。
- 运行块 - 在创建注入器后执行并用于启动应用程序。只有实例和常量才可以 注入运行块。这是为了防止进一步的系统 应用程序运行时的配置。
醇>
这意味着,您必须编写自己的Provider,您可以将其注入配置中。
另一种选择是使用模块的运行块。但在您的情况下,这是不可能的,因为您尝试使用动态生成的数据填充$stateProvider
。