如何将条件服务注入 AngularJS 1 Controller
How do you inject a condition service into AngularJS 1 Controller
我有一个 angular 模块,它被设计成独立的。消费应用程序可以添加带有 url 参数的指令,并且在与小部件交互时它将使用 url 作为整体数据源。这有一个通用的 LoadService,它使用 $http 加载数据,并期望一个特定的 JSON 格式到 运行 小部件。
好吧,现在我正在尝试重构,以便有人也可以创建自定义加载服务并将其注入到模块中,但如果未注入,它将使用默认数据加载。因此,我试图弄清楚如何创建一种方式来注入 CustomLoadService(如果它是由使用该模块的应用程序定义的)。但是,如果未定义自定义服务,它不应该出错,它应该只使用默认服务。
我正在研究 $injector.get
并认为这是一种可能性,但我无法将 $injector
注入控制器。我以为注入 $location
一样简单。像...
angular
.module('Widget')
.controller('WidgetController',[
'$scope',
'WidgetLoadService',
'$injector',
WidgetController
]);
这种方法似乎行不通,所以我想知道...解决此问题的最佳方法是什么 "angular way"。我应该如何使用 $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'} });
我有一个 angular 模块,它被设计成独立的。消费应用程序可以添加带有 url 参数的指令,并且在与小部件交互时它将使用 url 作为整体数据源。这有一个通用的 LoadService,它使用 $http 加载数据,并期望一个特定的 JSON 格式到 运行 小部件。
好吧,现在我正在尝试重构,以便有人也可以创建自定义加载服务并将其注入到模块中,但如果未注入,它将使用默认数据加载。因此,我试图弄清楚如何创建一种方式来注入 CustomLoadService(如果它是由使用该模块的应用程序定义的)。但是,如果未定义自定义服务,它不应该出错,它应该只使用默认服务。
我正在研究 $injector.get
并认为这是一种可能性,但我无法将 $injector
注入控制器。我以为注入 $location
一样简单。像...
angular
.module('Widget')
.controller('WidgetController',[
'$scope',
'WidgetLoadService',
'$injector',
WidgetController
]);
这种方法似乎行不通,所以我想知道...解决此问题的最佳方法是什么 "angular way"。我应该如何使用 $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'} });