2016-11-03 4 views
1

特定のサービスが注入される各機能に同じコード行を実行したい。例えば:角度サービスを注入するときに同じコードを実行する

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 
}); 

このサービスが注入されたときに同じ行のコードを書く必要がないのですか?

+0

サービスはシングルトンなので、これを行うためのユースケースは限られています。ここで達成しようとしていることと、すべてのコントローラが同じコードブロックを呼び出さなければならない理由についてもう少し説明できますか? – Claies

+0

$ rootScopeに、アプリケーションの翻訳文字列を含むオブジェクトを添付しました。私は全く同じ構文を使ってテンプレート上のそのオブジェクトにアクセスできるようにしたい。例: {{translationObject.Path.To.My.String}} $ rootScopeに直接アクセスできないため、**コンポーネント**では動作しません。私は私が使用できることを知っています: {{$ root.translationObject.Path.To.My.String}} しかし、私は特定の理由でしたくありません。プロダクションビルドプロセスでは、正規表現を使用して角表現を翻訳に置き換えますので、できるだけシンプルにする必要があります。 –

+0

これはあなたのサービスを設計するには貧弱な方法であり、失敗する傾向があります。サービスはシングルトンであり、サービスの価値を変更する瞬間に、これを注入したすべてのコントローラーに対して変更しています。主にすべてのコントローラが同じ '$ rootScope'を共有しているので、これは正しく動作しているように見えるかもしれませんが、間違いなく危険につながるパスです。 – Claies

答えて

0

これは$コントローラサービスをデコレートすることで行うことができますが、この場合はすべてのコントローラがこのように初期化されます。

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 hereを参照してください。

+0

デコレータであなたのリードをお寄せいただきありがとうございます。問題を完全に解決するもの –

0

私は@januszの答えに拡張し、 『注入された依存関係のみのコントローラに動作を適用する』の面倒を私が実際に使用して終了コードを提示したい。ここでは

angular.module('App').decorator('$controller', function ($delegate, sameInitService) { 
    return function (constructor, locals) { 
     var controller = $delegate.apply(null, arguments); 
     return angular.extend(function() { 
      var controllerInstance = controller() 
      var DIList = controllerInstance .__proto__.constructor.$inject; 
      console.log(DIList); 
      if (DIList.indexOf('sameInitService') !== -1) { 
      sameInitService.init(locals.$scope); 
      } 
      return controllerInstance; 
     }, controller); 
    }; 
}); 

があります修飾されたfiddle

+0

ニース、ありがとうGeorge :-) – janusz

関連する問題