将服务注入提供者

时间:2015-06-24 02:26:27

标签: angularjs

我需要获取一个在app.js中保存在我的控制器上的令牌,所以我创建了一个服务

var app = angular.module('UnikaPage', ['LocalStorageModule','RutasModule','UploadModule']);
app.service('AuthService', function() {
        var kc = {};

        var setKeycloak = function(keycloak) {
            kc = keycloak;
        };

        var getKeycloak = function(){
            return kc;
        };

        return {
            setKeycloak: setKeycloak,
            getKeycloak: getKeycloak
        };

    });

我的其他模块是UploadModule

var upload = angular.module('UploadModule', [ 'ngResource','flow','UnikaPage' ]).config(
        [ 'flowFactoryProvider', 'AuthService', function(flowFactoryProvider,AuthService) {
            AuthService.getKeycloak();
            flowFactoryProvider.defaults = {
                target : '/ng-flow-java/upload',
                permanentErrors : [ 500, 501 ],
                maxChunkRetries : 1,
                chunkRetryInterval : 5000,
                simultaneousUploads : 4,
                progressCallbacksInterval : 1,
                withCredentials : true,
                method : "octet"
            };
            flowFactoryProvider.on('catchAll', function(event) {
                console.log('catchAll', arguments);
            });
            // Can be used with different implementations of Flow.js
            // flowFactoryProvider.factory = fustyFlowFactory;
        } ]);

但我得到的AuthService未定义,我尝试在UnikaPage中没有加载UploadModule,我没有收到错误,但我的UploadModule不会加载。

我是否可以在UnikaPage和UploadModule

上遇到循环依赖问题

2 个答案:

答案 0 :(得分:2)

你不能在配置阶段调用一些东西。例如,如果您需要在配置上设置Upload Module,但同时需要运行AuthService,则无法执行此操作,因为此阶段是设置服务。

您可以使用一个UploadModule拦截器拦截AJAX ($http) $http个调用,评估您需要处理的内容,然后让请求进行。

在这里,在Angular.js API Reference(假设您使用的是1.2.x版)上,您可以看到如何设置拦截器,即时处理请求:https://code.angularjs.org/1.2.28/docs/api/ng/service/ $ http#拦截器。

另外,要记住的另一件事是,您需要提供一种方法,在AuthService发送内容之前加载UploadModule及其令牌等填充requestError。如果您需要识别可能发生的401 (Not Authorized),例如,返回ngFlow,您也可以为此设置拦截器,因此您可以调用登录窗口,例如,获取凭据用户。

编辑1:

我看到flowInit的代码......您正在使用flowInit指令来运行,不是吗?因此,您可以将指令config()传递给控制器​​中的对象,并扩展您在flow.js阶段定义的默认值。按照原始headers选项,您可以定义<div flow-init="flowOptions"> ... </div> 属性,您可以在其中定义该情况的标题。

angular.controller('Ctrl', ['$scope', function ($scope) {
    $scope.flowOptions = {
        headers: {
            'Authorization': 'token-here'
        }
    };
}]);

在控制器上:

defaults

编辑2(解决方案):

最终删除了在config()上定义的flowInit,让控制器定义了整个angular.extend()选项。

查看ngFlow的源代码,可以看到它们使用的是在对象内部没有递归遍历的本地 override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String?{ return sortedGroups[section].name } override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return self.groupsKnown[section].tags.count } override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("textInputCell", forIndexPath:indexPath) as! TagCell if self.tagsKnown.count != 0 { fetchKnownTags() var indexPathRow = (indexPath.row) let group = groupsKnown[indexPath.section].tags[indexPathRow] //return other cells self.deleteButton.hidden = false cell.TagNumberTxt.font = StoryBoard.myFont cell.TagNumberTxt.textColor = StoryBoard.cellColour cell.TagNumberTxt.text = "\(group.tagNumber)" } return cell } 。在此处阅读更多内容:http://docs.angularjs.org/api/ng/function/angular.extend

答案 1 :(得分:1)

删除循环依赖项。将AuthService移至自己的模块

angular.module('AuthModule', [])
    .factory('AuthService', function() {
        var kc = {};

        // etc
    });

然后将其添加到UploadModule依赖项

angular.module('UploadModule', ['ngResource', 'flow', 'AuthModule'])