2016-03-25 11 views
1

プロトタイプ関数の依存関係(コンストラクタパラメータ)へのアクセス方法はあまりありませんか?特にAngularJS Servicesの場合。AngularJSのプロトタイプ関数に依存関係を渡す方法

私だけ

function SomeSrvc($http, ...other deps...) { 
    var srvc = this; 

    // Verbose way of storing dependencies 
    srvc.$http = $http; 
    srvc.dep2 = dep2; 
    srvc.dep3 = dep3; 
    srvc.dep4 = dep4; 
} 

SomeSrvc.prototype.doSomething = function() { 
    var srvc = this; 
    // Do stuff with srvc.$http and other srvc.deps... 
}; 
+1

これが私のやり方です。私は、JSの人々がオブジェクトの「プロトタイプ」をそれほど頻繁に使用しない傾向がある理由の1つかもしれないと思います...しかし、少し冗長であっても常にそれは気に入っています。 – mgilson

+0

あなたは '$ injector'を注入できます。 – elclanrs

+0

@elclanrs '$ injector'を使って上記の例を表示できますか?プロトタイプ関数に渡す冗長な方法を変更しますか? – lebolo

答えて

1

私は外側のスコープにプロトタイプを使用して回避し、単に閉鎖使用されるだろう知っている最短:

function SomeSrvc($http, ...other deps...) { 
    var srvc = this; 

    srvc.doSomething = function() { 
    // just use $http without this/srvc 
    }; 
} 

ショートと素敵に。あなたが本当にプロトタイプのような構文のように、ただインデント(私の意見では、これは醜いだろう)を調整した場合:

function SomeSrvc($http, ...other deps...) { 
    var srvc = this; 



srvc.doSomething = function() { 
    // Do stuff with srvc.$http and other srvc.deps... 
}; 

} 

をこれは、あなたと同じ効果を与える - new演算子を使用して作成したオブジェクトは、この機能を持っております角度のあるサービスがこのように作成されます。

さらに、この方法は本当に良い副作用を持っています。サービスオブジェクトに変数を作成しないので、サービスにすべての変数を代入するとpublicになり、別の角度モジュールからアクセスできるようになり、それらはprivateとみなすことができます。現在、サービスを注入するだけで、注入されたすべてのモジュールを使用することができます。

SomeSrvc.$http 

これは完全に依存性注入のアイデアに反するものです。サービスではなく、コントローラの

+0

ありがとう、これは確かにあまり冗長ではない質問に答えます。私はこれまでこれを使用することを考えましたが、プロトタイプの継承を失いたくはありませんでした。 – lebolo

+0

@leboloなぜあなたはプロトタイプの継承が必要ですか?角度サービスはシングルトンです。** new **演算子を使用して** **作成されます。他の場所でコンストラクタ関数を再利用することはできないので、プロトタイプは時代遅れです。私の意見では、少なくとも... – smnbbrv

+0

私はそれを使用しました([this](http://blog.mgechev.com/2013/12/18/inheritance-services-controllers-in-angularjs/)は例を示しています_module.service_セクションにあります)。 – lebolo

1

の知っているこれは、実際にdocumentation

function SomeClass(greeter) { 
    this.greeter = greeter; 
} 

SomeClass.prototype.doSomething = function(name) { 
    this.greeter.greet(name); 
} 

で説明した公式の方法ですが、私が代わりにES2015クラスの構文を使用することを検討します。

export default class SomeClass { 
    constructor(greeter) { 
    this._greeter = greeter; 
    } 

    doSomething() { 
    this._greeter.greet(name); 
    } 
} 

あなたはそれについて読むことができ、よりhere

+0

ありがとう、 – lebolo

+2

これはあまり冗長ではありませんか? – smnbbrv

+0

@smnbbrvそうではありませんが、AngularJSでこれを行う「公式」な方法であることを知っておくと便利です。私にはちょっと嫌な気分になる= P – lebolo

0

が、私は少し違う何か

module.factory('myService', function(dep1, dep2){ 
    var createInternal=function(){ 
     var internal = Object.create(proto); 
     internal.init(...); 
     return internal; 
    }; 
    var service = function(){ 
     var internal = createInternal(); 
     return { 
      doSomething: function(a, b, c){ return internal.doSomething(a,b,c); }, 
      ... 
     }; 
    }; 
    var proto = { 
     init: function(...){ 
        dep1.greet(); 
        dep2.doSomethingElse(); 
        ... 
       }, 
     doSomething: function(a, b, c){ 
        dep1.grito(b); 
        dep2.haceOtraCosa(); 
       }, 
     ... 
    }; 
    return service(); 
}); 

を行ってきたそれは少し違うのですが、それは、ヘッダと、私が好きなプロトタイプの機能のリストにそれを壊します。

+0

はあまり冗長ではないように見えません...私にはスパゲティのように見えます。少なくとも20行のコードを使用するサービス上に空の関数を1つ作成するには... – smnbbrv

+0

私には、サービスの機能に関心があり、プロトタイプの機能は何かに関心があります。そうですね、定型文がたくさんありますしかし、コードの興味深い部分は、そのために読むのが簡単です。 – ryansstack

+0

これらの機能のいくつかを特別なサービスに入れて、どこにでも再利用することができます。私は本当に1つの行であなたのサービスを自動的にブートストラップするいくつかの外部関数でこれらのものの半分を取ることができると信じています – smnbbrv

関連する問題