22

使用例は単純です。同じ依存関係を共有する 2 つのコントローラーがありMyServiceます。このサービスは何らかの状態を保持していますmyVariable。から設定するとControllerOne、 によっても検出されControllerTwoます。

私が望むのは、各コントローラーが の独自のインスタンスを持つことですMyService。これmyVariableにより、他のコントローラーに影響を与えることなく各コントローラーで変更できます。

別の言葉で言えば、 singleton ではなくDependency Injection によって新しいインスタンスが返されるようにしたいのです。

4

2 に答える 2

22

あなたが望むかもしれないほど直接ではありません。サービスインスタンスは、インジェクターによって最初に取得され、インジェクターによって維持されるときに作成されます...つまり、それらは常にシングルトンです。here で魔法が起こります。特にprovider、provider インスタンスを providerCache オブジェクトに配置する関数を見てください。

ただし、希望を失わないでください。必要に応じて、サービスで共有したいものに対してコンストラクターを簡単に追加できます。

app.factory('myService', [function() {
     var i = 1;

     function Foo() {
        this.bar = "I'm Foo " + i++;
     };

     return {
          Foo: Foo
     };
}]);

app.controller('Ctrl1', function($scope, myService) {
  $scope.foo = new myService.Foo();
  console.log($scope.foo.bar) //I'm Foo 1
});

app.controller('Ctrl2', function($scope, myService) {
  $scope.foo = new myService.Foo();
  console.log($scope.foo.bar) //I'm Foo 2
});

編集: OP が指摘したように、コントローラーの外部で JavaScript コンストラクターを呼び出すために使用できる$injector.instantiateもあります。ここでのテスト可能性が何を意味するのかはわかりませんが、新しいオブジェクトを構築するコードを挿入する別の方法が得られます。

于 2012-11-28T16:59:57.290 に答える
3

JavaScript コードをモジュール化するための一般的なオプションはたくさんありますが、AngularJS のみに依存する何かを行いたい場合は、次のパターンが機能します。

1) まず、複数回注入するクラスを定義します。

function MyClass() {
  // ...
}

MyClass.prototype.memberMethod = function() {
  // ...
}

2) 次に、コンストラクターを定数として使用できるようにします。

angular.module('myModule').constant('MyClass', MyClass);

3) 最後に、ファクトリ パターンを使用して、クラスの名前付きの注入可能なインスタンスを作成します。

angular.module('myOtherModule', ['myModule']).factory('instanceOfMyClass', [
   'MyClass', 
   function(MyClass) { return new MyClass(); }
]);
于 2015-02-04T23:38:09.447 に答える