EventEmitterを使用してイベントのデフォルトを何らかの形で防ぐ方法がAngular2にありますか?
次のシナリオがあります。
import {Component, Output, EventEmitter} from 'angular2/core'
@Component({
selector: 'my-component',
template: `<button (click)="clickemitter.emit($event); onClick($event)" [style.color]="color"><ng-content></ng-content></button>`
})
export class MyComponent {
@Output clickemitter: EventEmitter<MouseEvent> = new EventEmitter();
private color: string = "black";
constructor() {
}
private onClick(event: MouseEvent): void {
if(!event.defaultPrevented) //gets called before the observers of clickemitter
this.color = "red";
else this.color = "blue";
}
}
@Component({
selector: 'my-app',
providers: [],
template: `
<my-component (clickemitter)="$event.preventDefault()">Hello Angular</my-component>
`,
directives: [MyComponent]
})
export class App {
constructor() {
}
}
私もこのためにプランカーを作成しました: https://plnkr.co/edit/yIoF1YgvkiZLBPZ6VHTs?p=preview
問題ボタンをクリックすると、ボタンの色が青にならず、代わりに赤になります。これは、EventEmitter.emit()/ next()が非同期で動作するように見えるためかもしれません。エミッタでonClick()メソッドをサブスクライブすることでこの問題を解決しようとし、ボタン(クリック)イベントハンドラでclickemitter.emit($ event)を呼び出すだけです。これは、ngAfterInit()でPlunker Demoを実行したときに機能します。しかし、誰かがクリックエミッターを後で購読するとどうなりますか?私のコンポーネントは、そのオブザーバーの前に再び呼び出され、私のコンポーネントは矛盾します。
The QuestionどうすればコンポーネントonClick()ハンドラーが最後に呼び出され、他のオブザーバーがその後のデフォルトの動作を妨げないことを保証できますか? ?または、私の目標を達成するための完全に異なる方法がありますか?
この問題を解決するには、HTMLテンプレートでこれを使用します
_<button (click)="clickemitter(a,b,c); $event.stopPropagation();"
[style.color]="color" >
<ng-content></ng-content>
</button>
_
$event.stopPropagation();
はデフォルトのクリックイベントを停止するように機能し、ボタンはclickemitter.emit(a,b,c)
である_(click)="...."
_で記述されたイベントのみを呼び出すため
たぶんこれはあなたへの完全な助けです。ありがとうございました。
return false;
を使用するだけです
ここに私が使用したコードがありますデフォルトを防ぐ
@HostListener('click') open(){
this._isOpen = !this._isOpen;
return false;
}
そしてstopPropagation
@HostListener('click', ['$event'])
onClick(e) {
alert("we have performed click");
e.stopPropagation();
}
このようにevent.preventDefaultを実装しました
export class ObserveComponent{
onSubmit(event:Event){
event.preventDefault();
}
}
オブジェクトに存在しないキーの値にアクセスしようとするたびにページのリロードを停止しました