我是Angular的新手。我的问题是,我无法弄清楚如何在第三方组件的上下文中执行的代码块中调用提供程序(我已创建)上的函数。基本上,我不知道如何在代码中注入我的提供者的引用。
详细信息:我正在使用第三方库(datajs)使用oData语法进行HTTP调用。该库允许我在执行之前自定义HTTP请求。我想要修改添加授权标头的请求,该标头包含我自己编写的函数(setAuthHeaderOnHTTPRequest),挂起我自己的'安全'提供程序。
注意:我不想修改第三方库。
这是我的'安全'提供程序,其中包含我想要运行的函数(setAuthHeaderOnHTTPRequest)
(function() {
angular.module('app.core')
.factory('security', security);
function security() {
var service = {
//...
setAuthHeaderOnHTTPRequest: setAuthHeaderOnHTTPRequest
};
return service;
function setAuthHeaderOnHTTPRequest(request) {
// code to add auth header
return (modifiedRequest);
}
}
})
以下是在第三方组件的上下文中运行的代码块。 如何在此代码块中为安全提供程序注入引用?
function configureODataHTTP() {
//Create a custom HTTP client for Odata calls see http://stackoverflow.com/questions/27365519/consuming-web-api-2-odata-endpoint-requiring-windows-authentication-with-breezej
var defaultHttpClient = OData.defaultHttpClient;
var myClient = {
request: function (request, success, error) {
// this is where I want to call my function on my 'security' provider
newRequest = security.setAuthHeaderOnHTTPRequest(oldRequest);
return defaultHttpClient.request(newRequest, success, error);
}
};
OData.defaultHttpClient = myClient;
}
答案 0 :(得分:0)
你做错了。使用angularjs框架已经提供的http拦截器。 https://docs.angularjs.org/api/ng/service/ $ HTTP#拦截。不要使用那个库,因为你需要将它包装在angularjs中,你正在重新努力。
答案 1 :(得分:0)
我找到了解决方案。我刚刚添加了对访问$ rootScope所需服务的引用(在服务启动后)。然后我可以在我的嵌套函数中访问它,如下所示:
// this is where I want to call my function on my 'security' provider
newRequest = $rootScope.security.setAuthHeaderOnHTTPRequest(oldRequest);
我真的更喜欢一种不那么黑客的解决方案,但这很有效。