0

我有一個設計爲自包含的角模塊。這一個消費應用程序可以通過URL PARAM添加指令,它會使用該URL時,它與小部件交互時的整體數據源。這有一個通用的LoadService,它使用$ http來加載數據,並且需要特定的JSON格式來運行這個小部件。你如何注入條件的服務到AngularJS 1控制器

那麼現在我想重構,從而使他人也可以創建自定義負載服務,並將其注入到模塊,但如果它不注射,然後它會使用默認的數據負載。所以我試圖找出如何創建,如果它是由消耗了該模塊的應用程序定義CustomLoadService注入的方式。但是,如果自定義服務沒有定義,它不應該錯誤,它應該只使用默認服務。

我正在調查$injector.get,看到作爲一種可能性,但我無法將$injector注入控制器。我認爲這將是簡單的$location注入。喜歡的東西...

angular 
    .module('Widget') 
    .controller('WidgetController',[ 
    '$scope', 
    'WidgetLoadService', 
    '$injector', 
    WidgetController 
    ]); 

這種方法似乎沒有工作,所以我想知道......什麼是最好的最「角的方式」來解決這個問題。我應該如何使用$注入器。

回答

0

你可以用$注射器:

app.controller('MainCtrl', function($scope, $injector) { 
    $scope.name = $injector.get('test').name; 
}).factory('test', function() { return {name: 'world'} }); 

所以,你可能有這樣的事情的結果:

app.controller('MainCtrl', function($scope, shareService) { 
    $scope.name = shareService.getData(); 

    shareService.setDataService('dataService2'); 

    $scope.name = shareService.getData(); 
}) 

.factory('shareService', function($injector) { 
    var dataServiceName; 

    return { 
    setDataService: function(name) { 
     dataServiceName = name; 
    }, 
    getData: function(name) { 
     return $injector.get(dataServiceName || 'dataService').data; 
    } 
    } 

}) 


.factory('dataService', function() { return {data: 'world'} }) 

.factory('dataService2', function() { return {data: 'world 2'} }); 
+0

看看我提供的,防止它的代碼,我在做什麼錯加工?我碰到一個「$注射器沒有定義」 –

+0

也許我錯過了差異,但好像你的榜樣應該是沒有什麼不同的,那麼我提供的代碼,但我的不行,我失去了什麼? –

+0

你實際上並沒有提供任何代碼......用你的代碼創建最小的plunk。 –