0

如何定义一个可以访问控制器/指令/服务的所有注入参数的函数,而不显式传递它们?

myShortHand = function(scope, http, element, url) {
    http.get(url).success(function (data) {
        element.html(data);
    });
}

function MyCtrl($scope, $http, $element) {
    $scope.name = 'Superhero';
    $scope.click = function() { myShortHand($scope, $http, $element, url); }
}

这只是一个简化的示例,并显示了样板代码的数量。我的速记实际上需要 4 个$参数,这有点违背速记的目的!请注意,我不能真正使用服务:$http可以注入服务,但需要使用$scope与. 有没有办法定义控制器方法(可能在原型中),可以在其参数列表中使用依赖注入并使用与调用它们的实例相同的注入器?$elementMyCtrl

4

1 回答 1

0

从您的问题中不清楚该myShortHand函数的定义位置,但如果它恰好在指令的链接函数中定义,您可以简单地在闭包范围内进行中继。在这种情况下,您不需要传递闭包中可用的参数。

接下来,您可以做的是注入$injector指令并将其作为$elementand旁边的唯一参数传递给辅助函数$scope。然后,在您的辅助函数中,您可以通过调用$injector.get方法检索任何服务。例如,要访问该$http服务,您可以编写:

myShortHand = function(scope, element, url, $injector) {
    $injector.get('$http').get(url).success(function (data) {
        element.html(data);
    });
}

如果您的助手无法中继闭包范围并且需要访问多个服务,则此技术将起作用。

说了以上所有内容后,我会重新考虑在您的助手中拆分代码。通常需要很多参数的函数没有很好地集中并且有很多副作用(或者做得太多)。

于 2013-05-11T17:33:46.500 回答