Javascript 在注入角度服务时运行同一段代码

Javascript 在注入角度服务时运行同一段代码,javascript,angularjs,Javascript,Angularjs,我希望对注入特定服务的每个函数运行相同的代码行。例如: app.service('sameInitService', function ($rootScope) { this.init = function (scope) { scope.foo = $rootScope.foo; } }); app.controller('oneController', function ($scope, sameInitService) { sameInitService.init($

我希望对注入特定服务的每个函数运行相同的代码行。例如:

app.service('sameInitService', function ($rootScope) {
  this.init = function (scope) {
    scope.foo = $rootScope.foo;
  }
});

app.controller('oneController', function ($scope, sameInitService) {
  sameInitService.init($scope); // <- This line of code
});

app.controller('twoController', function ($scope, sameInitService) {
  sameInitService.init($scope); // <- Is the same
});
app.service('sameInitService',函数($rootScope){
this.init=函数(作用域){
scope.foo=$rootScope.foo;
}
});
app.controller('oneController',函数($scope,sameInitService){

sameInitService.init($scope);//可以通过修饰$controller服务来完成,但在本例中,所有控制器都将以这种方式初始化

angular.module('App', [])
  .config(['$provide', function($provide) {

    $provide.decorator('$controller', [
      '$delegate', 'sameInitService',
      function controllerDecorator($delegate, sameInitService) {

        return function(constructor, locals) {
          sameInitService.init(locals.$scope);
          return $delegate(constructor, locals, true);
        }
      }

    ]);
  }])

请参阅jsfiddle。

可以通过修饰$controller服务来完成,但在本例中,所有控制器都将以这种方式初始化

angular.module('App', [])
  .config(['$provide', function($provide) {

    $provide.decorator('$controller', [
      '$delegate', 'sameInitService',
      function controllerDecorator($delegate, sameInitService) {

        return function(constructor, locals) {
          sameInitService.init(locals.$scope);
          return $delegate(constructor, locals, true);
        }
      }

    ]);
  }])

请参阅JSFIDLE。

我想扩展@janusz的答案,并展示我实际使用的代码,该代码负责“仅将行为应用于具有注入依赖项的控制器”:


下面是一个修改后的

我想扩展@janusz的答案,并展示我最终实际使用的代码,它负责“仅将行为应用于具有注入依赖项的控制器”:


这里有一个修改过的

服务是单例的,因此需要这样做的用例是有限的;您能解释一下您在这里要完成的是什么,以及为什么每个控制器都必须调用相同的代码块吗?我在$rootScope上附加了一个对象,其中包含应用程序的翻译字符串。我想成为able使用完全相同的语法访问模板上的对象。例如:{{translationObject.Path.to.My.String}这在组件上不起作用,因为它们不能直接访问$rootScope。我知道我可以使用:{{$root.translationObject.Path.to.My.String}但出于特定原因,我不想这样做。生产构建过程使用正则表达式将角度表达式替换为平移,因此我需要使其尽可能简单。这是一种糟糕的服务设计方法,并且容易失败。服务是单例的,当您更改服务中的值时,您就可以更改为每一个注入了此功能的控制器设置它。这看起来似乎工作正常,主要是因为所有控制器共享相同的
$rootScope
,但这肯定是一条导致危险的路径。为什么您甚至要将
$rootScope
与服务结合使用?为什么服务本身不能持有object,只需使用
$scope.translationObject=translationService.Object
?@Claies在所有控制器上更改值正是我想要的行为。我在rootScope上使用的原因是,我希望转换键在模板中全局可用,即使在没有带有服务injectedserv的控制器的模板中也是如此ICE是单例的,因此需要这样做的用例是有限的;您能解释一下您在这里要完成的是什么,以及为什么每个控制器都必须调用相同的代码块吗?我在$rootScope上附加了一个对象,其中包含应用程序的翻译字符串。我希望能够在tem上访问该对象使用完全相同语法的图版。例如:{{translationObject.Path.To.My.String}这在组件上不起作用,因为它们没有直接访问$rootScope的权限。我知道我可以使用:{{$root.translationObject.Path.To.My.String}但出于特定原因,我不想这样做。生产构建过程使用正则表达式将角度表达式替换为平移,因此我需要使其尽可能简单。这是一种糟糕的服务设计方法,并且容易失败。服务是单例的,当您更改服务中的值时,您就可以更改为每一个注入了此功能的控制器设置它。这看起来似乎工作正常,主要是因为所有控制器共享相同的
$rootScope
,但这肯定是一条导致危险的路径。为什么您甚至要将
$rootScope
与服务结合使用?为什么服务本身不能持有object,只需使用
$scope.translationObject=translationService.Object
?@Claies在所有控制器上更改值正是我想要的行为。我在rootScope上使用的原因是,我希望转换键在模板中全局可用,即使在没有注入服务的控制器的模板中也是如此谢谢你对装饰师的介绍,我根据你的代码发布了一个完全解决问题的答案谢谢你对装饰师的介绍,我根据你的代码发布了一个完全解决问题的答案