我有自己的指令:<form-wrapper>
现在这个指令使用自己的内部控制器,它使用一些Service
(User
服务)
像这样:
directives.directive("formWrapper", ['User', function(User) {
return {
...
controller: function($scope, $location, User) {
$scope.fields = User.get( {id: "1"} ); // GET
...
如您所见:我使用硬编码服务(User
)。
问题:我如何将服务作为指令的参数传递?要像这样使用它:
Service = comesFromArgument
$scope.fields = Service.get( {id: "1"} )
我想如果我将服务名称作为字符串(作为服务名称)传递,它将无济于事。传递参数通常发生在link-function
但不在控制器中。
更新(更多解释):
当使用directives.directive("formWrapper", ['User', function(User) {
名称'User'导致注入用户服务时,因为这就是IoC在这里工作的方式。它知道这是一项服务。但如果我这样做了:
<form-wrapper service="User">
//这就是我想要的。
然后,“用户”将只是一个字符串,而不是对用户服务的引用。
答案 0 :(得分:18)
您可以使用angular's $injector
service在控制器中为字符串注入服务。
在HTML中:
<form-wrapper my-attr-with-service="User">
...
</form-wrapper>
在指令定义中:
controller: function ($scope, $element, $attrs, $injector) {
var myService = $injector.get($attrs.myAttrWithService);
// ...
}
答案 1 :(得分:4)
另一种方法是使用控制器注入。$ inject,传递一个数组。
app.module('widgets').directive('formWrapper', formWrapper);
function formWrapper() {
return {
...
controller: formWrapperController,
}
}
formWrapperController.$inject = ['dataservice', '$http']
function formWrapperController(dataservice, $http) { }