2017-06-14 10 views
0

私はAngular 2の初心者です。私は"カスタムイベントへのバインディング"について勉強しているチュートリアルの例について疑問を抱いています。このサブビューを含めるサブコンポーネントを含めることを定義している。このビューにカスタムイベントバインドについてこのAngular 2チュートリアルがどのくらい正確に機能しますか?

<div class="container"> 
    <app-cockpit 
    (serverCreated)="onServerAdded($event)" 
    (blueprintCreated)="onBlueprintAdded($event)"> 
    </app-cockpit> 
    <hr> 
    <div class="row"> 
    <div class="col-xs-12"> 
     <app-server-element 
     *ngFor="let serverElement of serverElements" 
     [srvElement]="serverElement"></app-server-element> 
    </div> 
    </div> 
</div> 

は、だから私は、 app.component.htmlという名前のこの見解を持っている主なコンポーネントを持っています以前のメインビュー、 cockpit.component.htmlファイルの内容:

<div class="row"> 
    <div class="col-xs-12"> 
    <p>Add new Servers or blueprints!</p> 
    <label>Server Name</label> 
    <input type="text" class="form-control" [(ngModel)]="newServerName"> 
    <label>Server Content</label> 
    <input type="text" class="form-control" [(ngModel)]="newServerContent"> 
    <br> 
    <button 
     class="btn btn-primary" 
     (click)="onAddServer()">Add Server</button> 
    <button 
     class="btn btn-primary" 
     (click)="onAddBlueprint()">Add Server Blueprint</button> 
    </div> 
</div> 

のために提出する2ボタンが含まれていますm。ここで

最初の疑問、私のような何かをして理解していたものから:クリックイベントが発生したとき「、このビューのコントローラに定義されたonAddServer()メソッドを実行します。

(click)="onAddServer() 

のようなものを意味し、 "

import {Component, EventEmitter, OnInit, Output} from '@angular/core'; 

@Component({ 
    selector: 'app-cockpit', 
    templateUrl: './cockpit.component.html', 
    styleUrls: ['./cockpit.component.css'] 
}) 
export class CockpitComponent implements OnInit { 

    /* 
    EvebtEmitter è un oggetto del framework Angular che permette di emettere i nostri custom events 
    @Output() decorator usato per passare qualcosa fuori dal component 
    */ 
    @Output() serverCreated = new EventEmitter<{serverName: string, serverContent: string}>(); 
    @Output() blueprintCreated = new EventEmitter<{serverName: string, serverContent: string}>(); 

    newServerName = ''; 
    newServerContent = ''; 


    constructor() { } 

    ngOnInit() { 
    } 

    onAddServer() { 
    this.serverCreated.emit({serverName: this.newServerName, serverContent: this.newServerContent}); 
    } 

    onAddBlueprint() { 
    console.log('INTO onAddBluePrint()'); 
    this.blueprintCreated.emit({serverName: this.newServerName, serverContent: this.newServerContent}); 
    } 

} 

このように動作する必要があります:

newServerNamenewServerContent変数が挿入されたデータが含まれているcoockpit.component.ts私が持っているクラスにそう

、これらの変数が[(ngModel)]の指示に拘束されているため、ユーザーはフォームを使用します。

<input type="text" class="form-control" [(ngModel)]="newServerName"> 
<input type="text" class="form-control" [(ngModel)]="newServerContent"> 

上のユーザーのクリックがサーバーボタンonAddServerを(追加)方法がperfromedされ、serverNameのserverContentとイベントがコンテンツははexternで放出されています

this.serverCreated.emit({serverName: this.newServerName, serverContent: this.newServerContent}); 

だから疑いの余地はない:何が出来事なのか?それは私にはいくつかの情報を含む単純なJsonオブジェクトのようです。

は、第2の疑いがある:は、deorate @output()デコレータを使用しているためイベントのexternこのコントローラによって発せられるserverCreated。

デフォルト受信者とは何ですか?私のapp.component.tsクラスで、私はこのイベントを処理このメソッドを持っているので、それは親CompoNetをのコントローラである私には思える:(:{serverNameの:文字列、serverContent:文字列} serverData)onServerAdded

{ this.serverElements.push({ タイプ: 'server'、 名前:serverData.serverName、 内容:serverData。serverContent });

私が主成分の観点から、私はアプリ-コックピットコンポーネントは、これらのイベントを投げることを言っていることを言っているようですが、次のとおりです。exatly意味は何 }

親コンポーネント。

私の推論は正しいのですか、何か不足していますか?したがって、この戦略を使用して、子コンポーネントのコンポーネントを親コンポーネントに渡すことができることを意味します。あるいは、親から子へ、それが本当のユースケースシナリオであるかどうかわかりません。

答えて

2

あなたは基本的にあなたの推論で正しいです。あなたの疑問に特異的に来る

1)あなたはthis.serverCreated.emit()メソッド呼び出しを介して、あなたのケースでは、例えば、イベントを発する、あなたはまた、従って純粋emit()方法の任意のオブジェクトのパラメータとして渡すことができjavascript Jsonオブジェクトです。あなたはTypescriptクラスのインスタンスとして定義することができる他のオブジェクトを渡すことができます。文字列や数値などのプリミティブ型も指定できます。

2)@Output()デコレータで定義されたイベントは、子コンポーネントが親コンポーネントと通信できるようにするためのメカニズムとして使用されます。親コンポーネントは、対称@Input()メカニズムを介して子コンポーネントにパラメータを渡すことができます。

コンポーネント間で通信する方法の完全なリストはhttps://angular.io/guide/component-interaction

です
関連する問題