2016-10-26 11 views
9

私はAngularJS 1.xで作業しています。同じモジュールで同じサービスを複数回定義できます。次のコードスニペットでは、私はモジュールmyAppにサービスをnameService 2回を定義しています:「2番目の定義」:同じモジュール内でAngularJSサービスを複数回宣言する

(function() { 
    'use strict'; 

    angular 
    .module('myApp', []) 
    .controller('MainController', MainController) 
    .factory('nameService', nameService1) 
    .factory('nameService', nameService2); 

    MainController.$inject = ['nameService']; 

    function MainController(nameService) { 
    var vm = this; 

    vm.message = nameService.getName(); 
    } 

    function nameService1() { 
    return { 
     getName: getName 
    }; 

    function getName() { 
     return 'First Definition'; 
    } 
    } 

    function nameService2() { 
    return { 
     getName: getName 
    }; 

    function getName() { 
     return 'Second Definition'; 
    } 
    } 
})(); 

実行時には、AngularJSは、サービスの第2の実施によって返された値を使用します。 this Plunker exampleを確認してください。

したがって、経験的に、AngularJSは、常に以前のものを無視して、サービスの最新の定義を使用しているようです。

私の質問です:この動作を記述する正式な文書はありますか?

+3

JavaScriptは2番目のnameServiceに遭遇したときに前のものに優先します – aliasav

+0

JavaScriptは順番にコンパイルできますが、すでに定義されているサービスの2番目の定義を見つけたときに何をすべきかを決定するAngularフレームワークです。たとえば、常に最初のインスタンスを保持し、他のインスタンスを破棄することに決めることができますが、それとは逆に、常に最後のインスタンスを維持するように見えます。 私の質問です:この動作についての公式文書はありますか? – Andrea

答えて

1

ここでは、工場/サービスの定義を上書きしています。ファクトリ/サービスはシングルトンです。つまり、そのインスタンスは1つだけです。

factory('name', constructing_function) 

あなたの場合、

factory('nameService', nameService1)//Here object { getName: getName } will be assigned to nameService instance. 

factory('nameService', nameService2)//Here object { getName: getName } (#2nd definition) will be assigned to nameService instance. i.e. nameservice instance referring to (#2nd definition). 
+0

あなたの答えをありがとう。私はAngularJSではサービスがシングルトンだと知っていますが、Angularは以前のものを無視して常に最新の定義を取るという公式のAngularドキュメンテーションがあるかどうかを知る必要があります。この種の文章が文書にあるかどうか知っていますか? – Andrea

+0

そうは思わない。しかし、私は実際にセオンスの後ろで起こっていることを説明した。 – ram1993

+0

はい、ありがとうRam1993。しかし、技術的に私はそれを知っていますが、私は何らかの「公式なリファレンス」(ドキュメンテーションやハウツーなどで)が必要です。 – Andrea

1

JavaScriptがどのように働くかの方法だこと:

function Vinoth(){console.log("Printing first")} 

function Something(){console.log("Printing Something")} 

function Vinoth(){console.log("Printing Second")} 

あなたがconsole.log(Vinoth());を行うと、それは常にSecond 1を印刷します。以上の2番目の部分に:

angular 
    .module('myApp', []) 
    .controller('MainController', MainController) 
    .factory('nameService', nameService1) 
    .factory('nameService', nameService2); 

AngularJSのサービスは本質的にsingletonあるので、そのアプリケーションのライフサイクル全体で一つの例になるだろう。 nameService1 and nameService2は同じnameServiceinstanceを指しています。技術的には、nameServiceは、巻上に従って先行するようにnameService2を保持する。

+0

上記のコメントで "aliasav"と説明したように、すでに定義されているサービスの2番目の定義を見つけたときに何をすべきかを決定するAngularフレームワーク。たとえば、常に最初のインスタンスを保持し、他のインスタンスを破棄することに決めることができますが、それとは逆に、常に最後のインスタンスを維持するように見えます。私の質問です:この動作についての公式文書はありますか? – Andrea

+0

@アンドレア:クール、JavaScriptを見てください。Hoisting ....これは動作です。Angularjsも続きます... – Thalaivar

+0

アドバイスをいただきありがとうございますが、ここでホイストのメーターだと思う理由はありません。私のスニペットコードでは、2つの関数の名前が異なります( 'nameService1'と' nameService2')。 'factory()'メソッドのサービス名を識別する文字列だけが同じです( '' nameService "')。 – Andrea

0

いいえいいえこの機能の公式文書はありません。

この機能のドキュメントを追加するには、anglejの管理者にお尋ねください。

0

サービス(注入)を2回定義する必要はありません。より良い解決策は、サービスを1回定義することです。そして、これがベストプラクティスです

var nameService2 = angular.copy(nameService); 

、このインサイド

angular.module('myApp', []).controller('MainController', MainController) .factory('nameService', nameService1) 

は、我々のような、そのサービスを利用することができ、同様に使用します。

関連する問題