我有一个设计为自包含的角模块。一个消费应用程序可以添加带有url参数的指令,当它与小部件交互时,它将使用该url作为其整体数据源。它有一个通用的LoadService,使用$http来加载数据,并期望一个特定的JSON格式来运行小部件。
现在我正在尝试重构,以便有人也可以创建一个自定义加载服务并将其注入到模块中,但如果没有注入,那么它将使用默认的数据加载。所以我想弄清楚我如何创建一种方式,CustomLoadService被注入,如果它是由正在消费模块的应用程序定义的。但是,如果没有定义自定义服务,它不应该出错,它应该只使用默认服务。
我正在研究$injector.get
并看到这是一种可能性,但我在将$injector
注入控制器时遇到了麻烦。我以为这将是简单的$location
注入。类似…
angular
.module('Widget')
.controller('WidgetController',[
'$scope',
'WidgetLoadService',
'$injector',
WidgetController
]);
这个方法似乎不工作,所以我想知道…解决这个问题的最好的、最"有角度的方法"是什么?我应该如何使用$injector。
你可以使用$injector:
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'} });