2016-08-19 9 views
2

関数がパラメータを取り込むときに、親から子コンポーネントに適切に関数を渡す方法はありますか? ngOnInitで角2子コンポーネントにparamsの関数を渡す方法は?

、どの範囲までのような機能:今、間違っている

addToList(id) { 
    this.store.dispatch(this.listActions.addToList(id)); 
} 

ngOnInit、。

ngOnInit() { 
    this.addToList = this.addToList.bind(this, id); 
} 

私の親コンポーネントには、addToCart(id)という機能があります。

アイテムのリストを持つ子コンポーネントにその関数を渡したいと思います。アイテムの[追加]ボタンをクリックすると、addToCart(item_id)を親にコールバックします。

+0

なぜ関数を渡す必要がありますか?おそらくもっと角度のあるようなイベントを使うかもしれません – elclanrs

+0

idを修正するか、子コンポーネントがidを渡すことができますか? – hgoebl

+0

関数を渡すのは悪いですか?例を挙げると – user1354934

答えて

1

ここには詳細はたくさんありませんが、私が収集しているものから、コンポーネント間で共有されるデータオブジェクトを処理するための注入可能なサービス(ここでは、https://angular.io/docs/ts/latest/tutorial/toh-pt4.html)があります。ここにコードを入力するのではなく(これはチュートリアルのそのページによく表示されています)、私があなたがやろうとしていることとそのやり方について説明します。

ストアデータモデル全体をサービス(store.service.ts多分)で処理することができます。ストアモデルのさまざまなプロパティに対してCRUD関数が公開されます。ここに追加するリストには、サービス内のリストのオブザーバブルを返すパブリックゲッターと、リストに追加および削除するパブリック関数が必要です。このような何か:

@Injectable 
export class StoreService { 
    private _storeList:BehaviorSubject<Array<any>> = new BehaviorSubject<Array<any>>([]); 

    /*I'm sure the store has other properties, set them up here. I'd suggest 
    breaking any arrays out of the general object (unless you want to use 
    pipes which are awesome but keeping it simple here) but if the store has 
    a lot of general properties (name, address, whatever) they can be stored 
    in a single BehaviorSubject of type any. 
    */ 

    constructor(){} 

    get StoreList() { return this._storeList.asObservable() } 

    public addToList(id) { 
     let curVal = this._storeList.getValue(); 
     curVal.push(id); 
     this._storeList.next(curVal); 
    } 

} 

あなたは、親と子constructor(private _storeService:StoreService){}(と、それを必要とする任意の他のコンポーネント)の両方のコンストラクタにこのサービスを注入します。次に、子はリストにサブスクライブすることができます:get List() { return this._storeService.StoreList }、親はadd関数を呼び出してリストに追加できます。これをテンプレートに* ngForとして追加するときは、値を非同期パイプに渡すように注意してください。 *ngFor="List | async"またはあなたはあなたが間違いをしている理由を理解しようとしてあなたの髪を引き裂く可能性があります。 (あなたが完全に角度2に慣れまで、私が最初に不変回避勧めかもしれませんが)

この記事では、同様にこれで私をたくさん助けた:Maarekの答え@http://blog.angular-university.io/how-to-build-angular2-apps-using-rxjs-observable-data-services-pitfalls-to-avoid/

+0

上記のコメントを読んでいたら(私がこれを書いたときにはなかった)、あなたのしていることを見ていないように見えます。私はまだここにあなたがまだ役に立つかもしれないので、ここに残すつもりです。ありがとう。 – Maarek

+0

ありがとう。これは多くの助けになります。しかし私は詳細を説明するために私の質問を更新させてください! – user1354934

+0

私は実際にこの数週間で同じ種類の問題に頭を抱えていましたが、私がやったことを思い出しません。私は詳細を見て、私がコードベースで見つけることができるかどうかを見ます。 – Maarek

2

は良いものです、そしてありますおそらく、それを行うための '正しい'方法。私がここで提示しているのは、特に子供から親に伝達する簡単な手段です。

元の投稿で提案したのは、親がコールバックメソッドを子に送信することでした。そのため、子は適切なときにデータで呼び出すことができます。これを達成するには、イベントを使用して、Child内部からのEventEmitterを使用して、特定のタスク(Child内のいくつかのアクションでChildからParentへのデータ)を実行することが適切です。 https://angular.io/docs/ts/latest/api/core/index/EventEmitter-class.htmlと私はデモとして作られたこのPlunker:例あり、このAPIリファレンスを参照してくださいhttps://embed.plnkr.co/T1wFqVOhMXgX6NRfTuiC/

子では、あなたはこのようなコードを持っている:

import { Component, Input, Output, EventEmitter } from '@angular/core'; 
@Component({ 
    selector: 'item', 
    template: ` 
    <div class="item"> 
     <button type="button" (click)="addItem()">Add</button> 
     <p>{{id}} 
    </div> 
    ` 
}) 
export class ItemComponent { 
    @Input() id: string; 
    //key line here: this emitter can be bound to by parent to get notifications 
    @Output() add: EventEmitter<string> = new EventEmitter<string>(); 

    constructor() { } 

    addItem() { 
    //then when the button is clicked, emit events to the parent. 
    this.add.emit(this.id); 
    } 
} 

親がこのようなコンポーネントを作成して呼び出します:

addToList()は、コールバックが意図した作業を行う親の関数です。 $イベントは、子(ID)から渡されたデータです。

+0

、あなたはあまりにもいくつかのデータを取得しますか?だから '(onClick)=" addToList(item_id) "'?私は$イベントを使用しようとしていますが、それは本当に私の右を助けるつもりはないのですか?取得しているデータは、{{item_id}}や{{item_name}}などにあります。 – user1354934

+0

クリックするとaddItem()に、addItem()はChild(Item)クラスのメソッドになります。したがって、Itemの変数/コンテンツのいずれかに直接アクセスできます。例のように私はIDを取得しますが、それは何でもかまいません。送信したいものが複数ある場合は、それらをオブジェクトにまとめることができます。 addItem(){ let event = {"id":this.item_id、 "name":this.item_name}; this.add.emit(event); }、親に : <アイテムID = "1"(追加)= "addToList($イベント)"> ... addTooList(イベント){ LETのID = event.id。 let name = event.name; } –

+0

ああ私はこのようなものを意味します。私のコンポーネントは配列に基づいてアイテムをレンダリングしますが、各アイテムにはボタンがあります。クリックするとその特定のitem_idだけを送信しますか? user1354934

関連する問題