Angular2 EventEmitter和preventDefault()

时间:2016-03-01 13:05:01

标签: angular preventdefault eventemitter

Angular2中是否有办法以某种方式阻止使用EventEmitter的事件的默认值?

我有以下情况:

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() {

  }
}

我也为此制作了一个Plunker:https://plnkr.co/edit/yIoF1YgvkiZLBPZ6VHTs?p=preview

问题 如果我点击按钮,按钮的颜色将不会变为蓝色,而是变为红色。 这可能是因为EventEmitter.emit()/ next()似乎异步工作。 我试图通过在发射器上订阅我的onClick()方法来解决这个问题,并在我的按钮(单击)事件处理程序中调用 clickemitter.emit($ event)。当我在ngAfterInit()中执行此操作时,这适用于Plunker演示。但是如果有人后来订阅了这个陈词滥调呢?我的组件将再次在该观察者之前被调用,并且我的组件将不一致。

问题 我如何确保我的组件onClick()处理程序将在最后被调用,以保证其他观察者不能阻止之后的默认行为?或者是否有完全不同的方式来实现我的目标?

3 个答案:

答案 0 :(得分:12)

要解决此问题,请在您的html模板

中使用此功能
// Enemies.cs

    void Start () {
        Debug.Log (GameManager.get().curLevel); // always output = 0
    }

<button (click)="clickemitter(a,b,c); $event.stopPropagation();" [style.color]="color" > <ng-content></ng-content> </button> 用于停止默认点击事件时,您的按钮仅调用$event.stopPropagation();中写的事件(click)="...."

也许这对你有帮助。谢谢。

答案 1 :(得分:5)

只需使用<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> monday <select class="sel" id="monday"> <option value=""></option> <option value="00:00">00:00</option> <option value="00:15">00:15</option> <option value="00:30">00:30</option> <option value="00:45">00:45</option> <option value="01:00">01:00</option> </select> <br> <br>tuesday <select class="sel" id="tuesday"> <option value=""></option> <option value="00:00">00:00</option> <option value="00:15">00:15</option> <option value="00:30">00:30</option> <option value="00:45">00:45</option> <option value="01:00">01:00</option> </select> <br> <br>wednesday <select class="sel" id="wednesday"> <option value=""></option> <option value="00:00">00:00</option> <option value="00:15">00:15</option> <option value="00:30">00:30</option> <option value="00:45">00:45</option> <option value="01:00">01:00</option> </select>
这是我用于阻止默认

的代码
return false;

stopPropagation

  @HostListener('click') open(){
      this._isOpen = !this._isOpen;
      return false;
  }

答案 2 :(得分:0)

我像这样实现了event.preventDefault

export class ObserveComponent{
   onSubmit(event:Event){
     event.preventDefault();
  }
}

每当我尝试访问对象中不存在的键值

时,页面就会重新加载