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。 –