Javascript 为什么可以';我不能注射我的服务吗?
我有以下新服务:Javascript 为什么可以';我不能注射我的服务吗?,javascript,angularjs,Javascript,Angularjs,我有以下新服务: var SignatureService = function ($scope) { this.announce = function () { alert($scope.specificName); } }; SignatureService.$inject = ['$scope']; 该应用程序声明如下: MyAngularApp.service('SignatureService', SignatureService); MyAngu
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'];
其他几项服务以完全相同的方式添加到应用程序中,它们似乎都工作正常。然后,我声明并定义了一个控制器,如下所示:
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
$injector/unpr?p0=$scopeProvider您不能将$scope
注入自定义服务。这根本没有意义,因为SignatureService
可以注入任何地方,包括其他服务和其他控件。如果您说将$scope
注入到两个嵌套的控制器中,那么应该注入哪一个
Scope对象($Scope
)始终与某个DOM节点关联,并附加到该节点。这就是为什么在控制器和指令中会看到$scope
。这就是为什么不能将它用于服务的原因:服务与特定的DOM元素无关。当然,您可以注入$rootScope
,但这不太可能是您的问题所需要的
概要:$scope
是从$rootScope
创建的,并注入到必要的控制器中,但不能将其注入到自定义服务中
UPD。根据您希望使用服务定义可重用控制器方法的注释。在这种情况下,我将采用我称之为mixin的方法。在服务中定义方法,并将它们混合到必要的控制器中
app.service('controllerMixin', function() {
this.getName = function() {
alert(this.name);
};
});
然后用角度扩展控制器范围。扩展:
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
引用范围。另外,如果您更喜欢使用controllerAs语法,服务也不会改变,您只需扩展此
:
angular.extend(this, controllerMixin);
演示:服务不能有$scope
。$scope
始终存在于控制器或指令上下文中。您可以使用$rootScope
思想好的,谢谢,但是尝试在服务中访问$scope
的原因是我正在尝试创建一个中心函数,可以调用该函数来更改多个作用域之一的模型。有什么建议吗?服务范围不应该改变。服务修改/加载数据等。您应该将服务注入必要的控制器,然后使用其方法。因此,在控制器中,我将$scope
传递给服务方法?我这里的问题是,我试图在多个控制器之间共享一种方法,我认为应该使用服务。将范围作为参数传递给“中心函数”。@ProfK Check使用简单有效的mixix解决方案更新答案。