为什么我无法注入我的服务?

时间:2015-06-03 06:38:27

标签: javascript angularjs

我有以下新服务:

var SignatureService = function ($scope) {

    this.announce = function () {
        alert($scope.specificName);
    }
};
SignatureService.$inject = ['$scope'];

这是为应用程序声明的,如下所示:

MyAngularApp.service('SignatureService', SignatureService);

其他几项服务以完全相同的方式添加到应用程序中,它们似乎都运行正常。然后我声明并定义了一个控制器如下:

MyAngularApp.controller('MyController', MyController);
...
var MyController = function ($scope, Service1, Service2, $location, $modal, SignatureService) {
...
}
MyController.$inject = ['$scope', 'Service1', 'Service2', '$location', '$modal', 'SignatureService'];

我只是使用稍微不自觉的方式来定义服务并注入它是我正在处理的应用程序中的标准,因为这适用于所有现有服务,而我更愿意按照标准简单地插入。

当控制器加载时,我在浏览器控制台中得到一个[$injector:unpr],错误信息为:

$injector/unpr?p0=$scopeProvider <- $scope <- SignatureService

1 个答案:

答案 0 :(得分:4)

您无法将$scope注入自定义服务。它只是没有意义,因为SignatureService可以注入任何地方,包括其他服务和其他控件。如果你说将$scope注入两个嵌套控制器,应该注入哪一个,那么$scope应该是什么?

范围对象($scope)始终与某个DOM节点相关联,并附加到该节点上。这就是你在控制器和指令中看到$rootScope的原因。这就是为什么你不能在服务中使用它的原因:服务与特定的DOM元素无关。当然你可以注入$scope,但这不太可能是你在问题中所需要的。

摘要:$rootScope是从app.service('controllerMixin', function() { this.getName = function() { alert(this.name); }; }); 创建的,并注入必要的控制器,但您无法将其注入自定义服务。

UPD。根据您要使用服务定义可重用控制器方法的注释。在这种情况下,我会采用我称之为mixin的方法。定义服务中的方法并将它们混合在必要的控制器中。

angular.extend

然后使用app.controller('OneController', function($scope, controllerMixin) { angular.extend($scope, controllerMixin); // define controller specific methods }); app.controller('TwoController', function($scope, controllerMixin) { angular.extend($scope, controllerMixin); // define controller specific methods }); 扩展控制器范围:

controllerMixin

这非常有效,因为$scope没有this的任何概念,当混合到控制器中时,您可以使用this来引用范围。如果您更喜欢使用controllerAs语法,服务也不会改变,您只需要扩展angular.extend(this, controllerMixin);

Dictionary<string,object>

演示: http://plnkr.co/edit/ePhSF8UttR4IgeUjLRSt?p=info