Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么可以';我不能注射我的服务吗?_Javascript_Angularjs - Fatal编程技术网

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解决方案更新答案。