2016-11-30 4 views
1

私は大きなAngular2アプリケーションを開発しています。アプリケーションには、同様の動作をする多くのコンポーネントが含まれています。 DRYの原則の後、私は共有サービスにすべての共通コンポーネント機能を含んでいます。Angular2:コンポーネントとサービスの間のスコープ?

しかし、ほとんどのコンポーネント(foo.component.tsなど)では、特定のコンポーネント(foo.service.tsなど)のデータを取得する、対応する「パーソナル」サービスがあります。すべてのコンポーネントを合計すると、2つのサービスが使用されます。サービスはそれぞれ固有のサービスと共有サービスです。 「個人的な」サービスのためのコードは次のようになります。現在

export class MasterDataService { 
    getData(param) { 
    return this._http.get("some/url/"+param+"/) 
     .map((res) => { 
     return res.json(); 
     }) 
    } 
} 

、私のコンポーネントは、データをフェッチするために、共有サービスを使用します。私はまた、パラメータとして、私のコンポーネントを送って同じ機能で

public initializeController(dataService, component:any) { 
    this._activatedRoute.params.subscribe(
     (param: any) => { 
     this._param = param; 

     dataService.getData(param).subscribe(
      data => this._httpSuccess(data, component), 
      err => this._httpError(err) 
     ); 

     } 
    ); 
    } 

:私は今、これを行う方法は、共有サービス内の関数を呼び出し、その機能にPARAMTERとして「個人的な」サービスを送信することである

// In component 
    this._controller.initializeController(this); 

これは、私のHTMLのデータを含むコンポーネントにdataModelがあるためです。ジェネリック共有サービスは、パーソナルサービスの呼び出しと、自分のコンポーネント内のdataModelの更新を担当します。

setLocalData(data) { 
    console.log("Callback fired!!"); 
    this.masterdataModel = data; 
    this.loading = false; 
    } 

this.dataModel = { 
     data_1: "foo", 
     data_2: "bar", 
    }; 

私は、送信することによって、私の共有サービスを通じて、私のコンポーネントの私のモデルデータを設定する際に、機能するソリューションを発見した「この」私のサービス機能への私のコンポーネントからPARAMTERとして:

// In component 
this._controller.initializeController(this); 

// In service 
public initializeController(component:any) { 

    component.dataModel = {/* some new data */} 
} 

他の方法で共有サービスからコールバック機能やパーソナルサービスにアクセスすることができないため、パーソナルサービスとコンポーネントをパラメータとして送信します。

質問1:各コンポーネントが持つ「個人的な」サービスから機能を呼び出すことができるこの汎用サービスまたは機能をどのように構成しますか?私は正しい方法でそれをやっているのですか、それとももっと良い方法がありますか?

質問2:コンポーネントはサービス関数を呼び出すか、コンポーネントコールバックを設定するか、サービス内のコンポーネント内の変数にどのようにアクセスしますか?

質問3:質問:これは私の共有サービスで "this"のコンテキストを切り替えるために "=>"を使用しているためです。これがパラメータとしてコンポーネントを送信したのです。これにはどんな解決策がありますか?

ご協力いただきありがとうございます。あなたはその後、各コンポーネントのインスタンスは、独自のサービスインスタンスを取得し、コンポーネントで「個人的なサービス」を提供することができます

答えて

2

(これはあなたが望むものであるかどうかわからない)

@Component({ 
    selector: 'my-component', 
    providers: [MyComponentPersonalService] 
    ... 
}) 
class MyComponent { 
    constructor(private personalService:MyComponentPersonalService) {} 

が質問1:私はあなたを示唆Observableを返す共有サービス内のメソッドを作成し、パーソナルサービスがそのオブザーバブルにサブスクライブし、共有サービスが値を送出するときに必要なものを実行します。

質問2:質問1

として同じ質問3:はこの方法を中心に参照を渡すことは非常に奇妙であり、すべての

参照観測と例についてもhttps://angular.io/docs/ts/latest/cookbook/component-communication.html#!#bidirectional-serviceで避けるべきです。

関連する問題