2017-01-28 7 views
2

アムに注入することなく、サービスを利用して、私はangular2で静的関数を持つクラスを持っていると私は、私は、静的なクラスを持っているangular2する新しいangular2

ある静的な機能の一つにhttpリクエストを実装したいと思いますそれは、フォーム検証、私は静的関数でHTTPを使用する方法上記の私の場合はValidationService

constructor(private _http:Http){} 

static passwordValidator(control) { 
    if(control.value != undefined){ 
    if (!control.value.match(/^(?=.*[0-9])[[email protected]#$%^&*]{6,100}$/)) { 
    return { 'invalidPassword': true }; 
    } 
} 

} 

static emailValidator(){ 

return this._http. //this returns an error i would like to 
     //query server to see if email exists 

} 

FORM VALIDTION 
this.userform = this._formbuilder.group({ 
    first_name: [this.user.first_name, Validators.required], 
    last_name: ['', Validators.required], 
    username: ['', Validators.compose(
    [ 
     Validators.required,Validators.minLength(5) 
    ] 
)], 
    password: ['',Validators.compose([ 
    Validators.required,ValidationService.passwordValidator 
    ])], 
    email: ['', Validators.compose([ 
    Validators.required,ValidationService.emailValidator 
    ])], 
    role: ['', Validators.required], 

}) 

を管理しますおそらく変数

に割り当てることによって

このlet http...Hereを使用しているが、それは私に失敗しwhic RC5にあった

答えて

3

短い答え:

あなたは物事を行うべきではありませんそうですね。クラスをサービスとして注入し、静的メソッドを使用しないでください。

長い答え:すべての

まず、私はこれが今までRC5で働いていたとは思いません。

第2に、インジェクタにクラスを追加しない場合(コンストラクタ属性として別のサービス/コンポーネントに渡すことはありません)、サービスを角型で呼び出すべきではありません。理解。

第3に、角度サービスに関する静的メソッドはほとんど意味をなさない。はい、それが役に立つかもしれない場合があります(angular2のサービスは複数のインスタンスを持つかもしれませんが)、私はあなたのケースではないと信じています。

あなたが角度のサービスを利用したい場合は

私はあなたがあなたのサービスの注射を持っている必要があり Httpを使用する場合を意味し、 as a constructor attribute to another service/component上に語ったとして、あなたがそれらを注入しなければならない(と Http 角度サービスです)。

答えはいいえ、いい方法ではできません。

ただし、回避策があります。

static emailValidator(http: Http) { 

およびコンポーネントに:全ての

まず、あなたの静的関数にHttpインスタンスを通過することは簡単であるthis.httpがHTTPである

ValidationService.emailValidator(this.http) 

コンポーネントに注入しました。

別の方法です。サービスは自分で簡単に作成できます。サービスは、コンストラクタには噴射要求を持っていない場合は、元のHttpが注入されるように二つのことを必要とし、あなたは、単にしかし

let myhttp = new Http(); 

を行うことができます(何を注入しない)、https://angular.io/docs/ts/latest/api/http/index/Http-class.html参照:だから

constructor(_backend: ConnectionBackend, _defaultOptions: RequestOptions) 

また、引数として2つの他のエンティティ/サービスを渡す必要があります。インスタンス化する必要があるかもしれません。最後に、独自のインジェクタを作成しています。

第3の方法は、標準的な角型インジェクタを取り、その周りを試してみることです。

これはすべて動作する可能性がありますが、開発者として私はそのようなものをサポートする必要がある場合は泣くでしょう。

+3

'私はthat' 1 – Xymanek

+1

素敵な回答smnbbrvのようなものをサポートする必要がある場合、私は泣くだろう開発者として、IVEはサービスであるためにバリデータを変更することを決めたが、他がある場合はその良いが探求しますあとで便利になるかもしれないオプション –

+1

私はまた、時にはこれらのことを知ることが有用なので、誰かを助けてくれることを願っています。一週間前に私は同様の問題を抱えていました。単純なクラスにサービスインスタンスを渡し、それを直接クラスコンストラクタに渡して(最初の回避策)、それを達成するのに役立ちました。 2番目の回避策は、実際にはサービスの単体テストに非常に多く使用されるため、これも役立ちます。 – smnbbrv

0

シングルトンの静的インスタンスを作成する方法があります。 ValidationServiceの内部で以下のコードを使用してください。コンストラクタでは、静的インスタンス変数を現在のインスタンスに割り当てています。

静的メソッド内のインスタンスにアクセスし、Httpサービスを動的に使用できます。コード下記のおemailValidatorの使用インサイド

static _instance: ValidationService; 
constructor(private _http: Http) { 
    if (!ValidationService._instance) { 
     ValidationService._instance = this; 
    } 

    return ValidationService._instance; 
} 

:あなたは、ValidationServiceを使用ValidationService依存性を注入し、emailValidatorが必要とされてwhereeverコードの下に使用するコンポーネント内部

static emailValidator():Observable<any> { 
    return this._instance._http.get("").map((data) => { 

    }); 

} 

ValidationService.emailValidator().subscribe((data)=>{ 

});