2015-06-24 159 views
2

我需要得到被拯救了我在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是未定义的,我尝试不加载UploadModule在UnikaPage中,我没有得到错误,但我的UploadModule不会加载。

我可以得到UnikaPage和UploadModule

循环依赖的问题

回答

2

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

您可以拦截带有一个$http拦截器的UploadModuleAJAX ($http)调用,评估您需要处理的内容,然后发出请求。

在这里,关于Angular.js API参考(假设您使用的是1.2.x版本),您可以看到如何设置一个拦截器,处理动态请求:https://code.angularjs.org/1.2.28/docs/api/ng/service/ $ http#拦截器。

另外,要记住的另一件事是,你需要提供一种方式来加载和填充AuthService及其令牌等,然后UploadModule派遣的东西。例如,如果您需要识别可能发生的某些requestError,则返回401 (Not Authorized),您也可以为其设置拦截器,例如,可以调用登录窗口来获取用户的凭据。

编辑1:

我看到的ngFlow代码...您正在使用flowInit指令运行,不是吗?因此,您可以传递指令flowInit一个在您的控制器中作用域的对象,并扩展您在config()阶段定义的默认值。在原始flow.js选项之后,您可以定义一个headers属性,您可以在其中定义该情形的标头。

<div flow-init="flowOptions"> 
    ... 
</div> 

在控制器:

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

编辑2(溶液):

它结束了除去上配置()中定义的defaults,又让到控制器定义整个flowInit选项。

查看ngFlow的源代码,可以看到它们使用本地angular.extend(),该对象没有递归遍历。在这里阅读更多:http://docs.angularjs.org/api/ng/function/angular.extend

+0

谢谢,问题是UploadModule使用ng-flow,并且它不使用$ http来上传网站的部分 –

+0

谢谢,这是个好主意,但它不起作用,我猜flow-init会被覆盖有一点。我查看了头文件,我甚至尝试用token来手动添加flow-init =“{headers:.....}”,但它不起作用。也许提供者重写flow-init。 –

+0

尝试删除在config()中定义的默认值,并让控制器定义“flowInit”。仔细查看'ngFlow'的源代码,可以发现它们使用本地'angular.extend()',该对象内没有递归遍历。它可以是一个反馈,并且他们需要在'flow.js'的端口上修改它,因为这些选项可以在主对象内部具有另一个级别。在这里稍微阅读一下:https://docs.angularjs.org/api/ng/function/angular.extend –

1

解除循环依赖关系。移动AuthService自身的模块

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

     // etc 
    }); 

然后将其添加到UploadModule依赖

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

Yeap这使得更有意义 –

+0

对不起,这不工作,因为我有人告诉你不能注入配置服务,$注入后创建配置。 –