2015-06-24 371 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

對不起,這不工作,因爲我有人告訴你不能注入配置服務,$注入後創建配置。 –