带有属性指令的 Angular 2 自定义状态

标签 angular directive

我想创建一些小指令来检查输入是否集中在模板规则中。
使用带有(焦点)和(模糊)事件的组件很容易,但是此代码将在项目中的每种形式中出现。所以创建一个指令是个好主意。

请关注somefield.focused

<div class="form-group" [ngClass]="{'error': !somefield.valid && !somefield.focused }">
  <div class="controls">
    <input type="text" class="form-control" name="somefield" [(ngModel)]="model.somefield" #somefield="ngModel" required minlength="5" maxlength="15" />
    <div class="error-block" *ngIf="!somefield.valid && somefield.errors?">Some error occurred</div>
  </div>
</div>

我知道如何使用 HostListener 来捕捉焦点状态的变化
但我不知道如何将这种状态保存在元素中,因此可以在模板中使用。

import { Directive, ElementRef, HostListener } from '@angular/core';

@Directive({
  selector: 'input[focused]'
})

export class FocusedDirective {

  constructor(private el: ElementRef) {
    // TODO: set focused to false
  }

  @HostListener('blur', ['$event'])
  onBlur(e) {
    // TODO: set focused to false
  }

  @HostListener('focus', ['$event'])
  onFocus(e) {
    // TODO: set focused to true
  }

}

最后但并非最不重要的是,默认情况下不可能为任何输入文本或密码的输入分配指令?

最佳答案

@Directive({
  selector: 'input[focused]',
  exportAs: 'hasFocus'
})

export class FocusedDirective {

  hasFocus:boolean = false;
  focusChange:EventEmitter<boolean> = new EventEmitter<boolean>();

  constructor(private el: ElementRef) {}

  @HostListener('blur', ['$event'])
  onBlur(e) {
    this.hasFocus = false;
    this.focusChange.emit(this.hasFocus);
  }

  @HostListener('focus', ['$event'])
  onFocus(e) {
    this.hasFocus = true;
    this.focusChange.emit(this.hasFocus);
  }
}

该指令允许两种方式使用 hasFocus值(value)
  • 引用指令


  • <input focused #isFocused="hasFocus">
    <div>has focus: {{isFocused.hasFocus}}</div>
    
  • 绑定(bind)到事件


  • <input focused (focusChange)="isFocused = $event">
    <div>has focus: {{isFocused}}</div>
    

    关于带有属性指令的 Angular 2 自定义状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41675231/

    相关文章:

    angular - 我正在使用 angular 6.1.0 angular-cli 7 primeng 7 : getting error as "Initializers are not allowed in ambient context"

    angular - 为什么将空字符串设置为空 react 形式成为空字符串

    angularjs - AngularJs 中 ng-model 的 Getter & setter 支持

    angular2 从指令访问 ngModel 变量

    typescript - 如何从 Angular2 TypeScript 中的模块文件夹加载多个类?

    angularjs - 在 AngularJs 1.7.2 中对降级的 Angular 5 组件使用 NgRef

    javascript - 根据条件将两个 Angular Material 选择之一设置为所需

    javascript - Angular flex-layout 错误溢出

    AngularJS - 指令双向绑定(bind)不适用于隔离范围

    angularjs - angular 指令处理 http 请求