2016-06-21 1 views
0

は、私はこのようになりますキッチンのクラスがあるとしAngular2:双方向バインディングを行う場合、明示的にEventEmitterを使用する必要がありますか?</p> <pre><code>@Component({ template: ` <kitchen [(kitchenLunch)]=lunch></kitchen> ` }) export class House { private lunch: Lunch; } </code></pre> <p>ハウスコンポーネント:

  • サブコンポーネントに含まれていKitchen
  • 家は、いくつかの状態を含むデータモデルを持っています。
  • ハウスには、データモデルの台所との双方向バインディングが設定されています
  • ハウスまたはキッチンでデータモデルが変更されると、両方の場所に変更が表示されます。

私の質問はキッチンの@Outputの構文です。これは現在私が使用しているものです:

@Component({ 
    selector: 'kitchen', 
    template: '...' 
}) 
export class Kitchen { 

    @Input 
    private kitchenLunch: Lunch; 

    @Output 
    private kitchenLunchChange: EventEmitter<any> = new EventEmitter(); 

} 

これは私の予想通りです。私はKitchenコンポーネントでkitchenLunchを更新するたびに、私は次の操作を行います。

this.kitchenLunch = **Something** 
this.kitchenDataModelChange.next(this.kitchenDataModel); 

しかし、これは少し冗長なようです。私が本当にやりたいことは、このような何かをするために台所クラスの短縮である:

this.kitchenLunch = **Something** 

質問:

私はkitchenLunchを更新するとき

@Component({ 
    selector: 'kitchen', 
    template: '...' 
}) 
export class Kitchen { 

    @Input 
    @Output 
    private kitchenLunch: Lunch; 

} 

その後、私はちょうどこれをやりたいです

  1. プライベートメンバーを入力にすることは可能ですか&出力?
  2. EventEmitterではない@Outputを使用できますか?
  3. 私はここで使用することができる/いくつかの短所はありますか?
  4. @Outputの名前には、入力と同じ名前のChangeを指定する必要があります。この場合kitchenLunch + Change。私はこれを試行錯誤で見つけました。これはどこに文書化されていますか?

答えて

1

1)

詳細はわかりませんが、私はそれが動作すると思います。見つけやすいはずです。

2)無

3)無

4)https://angular.io/docs/ts/latest/guide/template-syntax.html

[(ngModel)] 角度 "脱糖" に、より一般的なパターンの具体例であります[(x)]構文を プロパティバインディングのx入力プロパティに、イベントバインディングのxChange出力プロパティに追加します。 Angularは、イベントプロパティーのバインディングのテンプレート文を、 = $ eventをテンプレート式のリテラル文字列に追加します。

[(X)] = "E" < ==> [X] = "E"(XCHANGE)= "E = $イベント"

我々は独自の双方向結合ディレクティブを書くことができますこの の問題を悪用します。

0

双方向バインディングでOuputEventEmitterを使用する必要はありません。

ただし、片方向バインディングはEventEmitterと併用することをお勧めします。これは、パフォーマンスが向上する可能性があるためです。簡単に言えば、変化検出量を減らす角度2が実行する必要があります。ここhttp://blog.mgechev.com/2016/01/23/angular2-viewchildren-contentchildren-difference-viewproviders/

関連する問題