模糊事件未在角度分量上触发

时间:2018-09-05 04:52:19

标签: angular components custom-controls

我正在尝试获取一种反应形式来正确处理模糊事件,并且似乎对模糊事件没有适当的反应。

import { Component, HostListener, HostBinding } from '@angular/core';

@Component({
  selector: 'app-combo-box-basic',
  templateUrl: './combo-box-basic.html'
})
export class ComboBoxBasic {

  @HostListener('blur', ['$event.target']) onBlur(target) {
    console.log(`onBlur(): ${new Date()} - ${JSON.stringify(target)}`);
  }
}
<div class="btn-group mr-3">
  <input (blur)="onBlur($event.target)" type="text" class="btn btn-outline-success">
  <div class="btn-group" ngbDropdown role="group" aria-label="Button group with nested dropdown">
    <button (blur)="onBlur($event.target)" class="btn btn-outline-primary" ngbDropdownToggle></button>
    <div class="dropdown-menu" ngbDropdownMenu>
      <button class="dropdown-item">One</button>
      <button class="dropdown-item">Two</button>
      <button class="dropdown-item">Four!</button>
    </div>
  </div>
</div>

2 个答案:

答案 0 :(得分:1)

经过大量搜索和实验,我发现了一些使其正常工作所需的项目。 A fully functional demo can be found here

  1. Outer元素必须具有:tabindex="0",以便可以聚焦。这可以通过以下方式实现:@HostBinding('attr.tabindex') tabindex = '0';

  2. 为模糊事件添加HostListener将捕获外部组件:@HostListener('blur', ['$event.target']) onBlur(target) { ... }

  3. 您仍然需要捕获内部组件的模糊事件,以便仍会触发点击和退出。 (blur)="onBlur($event.target)"

import { Component, HostListener, HostBinding } from '@angular/core';

@Component({
  selector: 'app-combo-box-basic',
  templateUrl: './combo-box-basic.html'
})
export class ComboBoxBasic {

  // Make sure container can receive focus or else blur events won't be seen.
  @HostBinding('attr.tabindex') tabindex = '0';
  @HostListener('blur', ['$event.target']) onBlur(target) {
    console.log(`onBlur(): ${new Date()} - ${JSON.stringify(target)}`);
  }
}
<div class="btn-group mr-3">
  <input (blur)="onBlur($event.target)" type="text" class="btn btn-outline-success">
  <div class="btn-group" ngbDropdown role="group" aria-label="Button group with nested dropdown">
    <button (blur)="onBlur($event.target)" class="btn btn-outline-primary" ngbDropdownToggle></button>
    <div class="dropdown-menu" ngbDropdownMenu>
      <button class="dropdown-item">One</button>
      <button class="dropdown-item">Two</button>
      <button class="dropdown-item">Four!</button>
    </div>
  </div>
</div>

答案 1 :(得分:1)

blur 事件不会在 formarray 中的控件上触发

同样的问题,即 blur 事件未触发,与 @ronnblack 建议的解决方案相同,但在不同的情况下: 就我而言,模糊事件未在 formarray 下触发。虽然在开发模式下触发了模糊事件,但是在生产版本中,模糊事件不会在 inputselect 中触发,没有检查其他事件。解决方法是一样的,设置tabindex="0"为formarray包含div,事件开始触发。以防万一,如果有人面临同样的情况。