私はAngular 2コンポーネントとそのコンポジションを試してみましたが、ネイティブイベントのバブリングと@Output名の衝突によって引き起こされる醜い動作に遭遇しました。
テンプレート内のフォームを持つコンポーネントapp-formがあります
<form (ngSubmit)="submitButtonClicked($event)">
<input type="text"/>
<button type="submit">Send</button>
</form>
このフォームコンポーネントをapp-middleコンポーネントで使用します。このコンポーネントには、submitという名前の独自のイベントエミッターがあります。
@Component({
selector: 'app-middle',
templateUrl: './middle.component.html',
styleUrls: ['./middle.component.css']
})
export class MiddleComponent implements OnInit {
@Output() submit = new EventEmitter<string>();
constructor() { }
emitSubmitEvent() {
this.submit.emit("some data");
}
}
テンプレート:
<div>
<app-form></app-form>
</div>
そしてテンプレート付きのアプリコンポーネント:
<app-middle (submit)="submitListener($event)"></app-middle>
これで、submitListenerが呼び出されます
「寄生的」な振る舞いは、DOMイベントのバブリングに基づいていると思います。 submitButtonClickedハンドラーのevent.stopPropagation()で停止できますが、停止を忘れると、かなり醜いエラーが発生します。
一般に、私はこの動作を非常に危険だと考えています。私が間違っていなければ、すべてのイベントバインディング式ハンドラーは、内部コンポーネントからのネイティブイベントによって「寄生的に」呼び出される可能性があります。 DOMイベントのいずれかと同じ名前の場合( https://developer.mozilla.org/en-US/docs/Web/Events )そして、上位互換性については触れません...
ここで見ることができる同じ問題: https://bitbucket.org/winsik/submit-event-issue/src
この問題に遭遇しましたか? @出力にどのような名前を付けますか?
接頭辞@Output
私のコンポーネントの名前が付いたイベント。これは非常にうまく機能しているようで、説明した問題を回避する一貫した明確な規則を提供します。たとえば、次のようなコンポーネントがあるとします。 TurnEditorComponent
-@Output
イベントには、turnEditorChange
、turnEditorFocus
、turnEditorBlur
などの名前が付けられます。