2016-11-02 9 views
2

いくつかのルートは静的なページにすぎません。
これらのルート(50以上)では、ルートが開始されるときに、2つの異なるサービスで2つのメソッド(以上)を呼び出す必要があります。
簡単な解決策は、各ページでngOnInitメソッドを呼び出し、前述のメソッドを呼び出すことです。
これは、同じコードを50種類のファイルにコピーして貼り付けることを意味します。コピーして貼り付けるのは悪いですが、維持することはできません。複数のコンポーネント/ルートを持つngOnInitでサービスのメソッドを呼び出す方法

例を作るために:

は、私がページ "よくある質問"(手動割り当てられたID:52)を持っているとページが(手動で割り当てられたID:13) "会社を探します"。これらは2つの異なるルートです。
私は管理パネルからそれらのページを編集するために使用されるサービス "エディタ"を持っており、私が見ているページを追跡する必要があります。
私は、ページがすでにバックエンドに照会されたかどうか、またはサーバーから引き出す必要があるかどうかをチェックするサービス "キャッシュ"を持っています。
これらのサービスはどちらも、そのルートに手動で割り当てたIDを知りたいと思っています。
この特定のケースのIDはデータベース/ APIのクエリに使用されますが、この詳細は質問中心ではなく、同様の問題を持つ他の人の回答を無効にすべきではありません。

// Page FAQ 
id: number 
constructor() { 
    this.id = 52; // 52 is the id that I assigned to the page FAQ 
} 
ngOnInit() { 
    editorService.keepTrack(this.id); 
    editorService.moreMethod().notMaintainable().whatIfIChangeSomething(this.id/0); 
    cacheService.keepTrack(this.id); 
} 

// Page Find Us 
id: number 
constructor() { 
    this.id = 13; // 13 is the id that I assigned to the page Find Us 
} 
ngOnInit() { 
    editorService.keepTrack(this.id); 
    editorService.moreMethod().notMaintainable().whatIfIChangeSomething(this.id/0); 
    cacheService.keepTrack(this.id); 
} 

さて、これは私が手で問題に関連していない内容で質問をオーバーロードする必要が表示されていないとして、簡略化した例があります。

私が考えることができる唯一の解決策は、3番目のサービスを作ることです。これは他の2つのメソッドを呼び出します。
したがって、すべてのページで、ngOnInitでこの単一のサービスメソッドを呼び出すだけで、この3番目のサービスに他の2つを呼び出す方法についての実装を残す必要があります。
これはコピーと貼り付けを最小限に抑え、実装を単一のmanteinableファイルに残します。例を作るために

// Page FAQ v2 
id: number 
constructor() { 
    this.id = 52; 
} 
ngOnInit() { 
    inceptionService.doStuff(this.id); 
} 

// Page Find Us v2 
id: number 
constructor() { 
    this.id = 13; 
} 
ngOnInit() { 
    inceptionService.doStuff(this.id); 
} 

// InceptionService 
export class InceptionService { 
    doStuff(data) { 
    editorService.keepTrack(data); 
    editorService.moreMethod().notMaintainable().whatIfIChangeSomething(data/0); 
    cacheService.keepTrack(data); 
    } 
} 

質問です:
これを行うには良い方法はありますか?私は最高のアプローチを使っていないと感じています。
私はまだサービスを悪用しているように感じています。

+0

'ngOnInit()'で何をしているのかを示すコードを投稿することができれば、それに従う方が簡単です。 –

+0

私はこの例を追加しました。 – Kunepro

+0

「52」と「13」はどこから来たのですか?あなたはそのコンポーネントを必要としますか、それともグローバルサービスのようなトップレベルでそれを得る方法はありますか? –

答えて

1

ミハルDymelの選択肢が有効であり、私の「InceptionService」よりも優れたアプローチで、すべての私のニーズを満足させるだろうが、私は彼の答えはあったが、ギュンターZöchbauerの答えは、より良い、より保守および多くの角度のアプローチを使用したことを感じました不完全な。
GünterZöchbauerの答えでも、Alex Rickabaugh @alxhubが私の手助けをしたこの解決策を見つけるためのインプットが与えられました。

ここで私はangular-cli構造を参照しています。 app.component.html上

置き換える
<router-outlet>
とapp.component.ts上
<router-outlet (activate)="newComponentActivated($event)">

"編集サービス"

updateCurrentPage(component) { 
    console.log(component); 
} 

newComponentActivated(component) { 
    // Updating tracked page ID 
    this.editorService.updateCurrentPage(component); 
} 

今夜経路が変更されると、引数とメソッドを含むコンポーネントのコピーがエディタサービスに通知されます。
これは、ルーティングされたコンポーネントで何かを拡張または実装する必要がないことを意味します。

1

イベントをルーティングしてそこからメソッドを呼び出すことができます。 (How to detect a route change in Angular 2?参照)

これはサービス内でも機能します。

+0

私はこのアプローチが気に入っていますが、コンポーネント内でハードコーディング(またはハードコーディングされたもの)はできないという事実を限定しています。たとえば、DBに照会するIDとして数字を使用することはできません。私はそのルートを使用しなければならないでしょう。そして、もし私が "ダーリンの学習"から "学習aladeen-for-aladeens"へのルートを変更したいのであれば、それは問題かもしれません。 DB内の参照。 – Kunepro

+0

ガードもこれに対応している可能性がありますhttps://angular.io/docs/ts/latest/guide/router.html#!#guardsコンポーネントタイプはルートから利用できます。たとえば、静的な値を取得する方法や、これらのコンポーネントで静的メソッドを呼び出す方法があります。 –

+0

ガードにコンポーネントからプロパティやメソッドを渡すことができません。例を挙げてください。 – Kunepro

2

これらのルートの基本クラスを作成し、この基本クラスからコンポーネントを継承させることができます。

export class BaseComponent { 
    ngOnInit() { 
     //your service calls 
    } 
} 

export class MyStaticComponent1 extends BaseComponent { 
    ngOnInit() { 
     super.ngOnInit(); 
     //component specific calls 
    } 
} 
+0

このアプローチの問題は、コンポーネントの特定のタスクのためにコンポーネント自体の内部でngOnInitを使用できなくなることです。 私は、拡張ngOnInitを失い、拡張から利益を得られません。 ngOnInitはAngular2固有のメソッドなので、私はこの制約を処理するのではなくサービスを悪用することをお勧めします。 – Kunepro

+1

コンポーネントから 'super.ngOnInit()'を呼び出してから、特定のタスクを実行できます –

関連する問題