• [Angular] Using directive to create a simple Credit card validator


    We will use 'HostListener' and 'HostBinding' to accomplish the task.

    The HTML:

          <label>
            Credit Card Number
            <input 
              name="credit-card" 
              type="text"
              credit-card
              placeholder="Enter your 16-digit card number">
          </label>

    Create directive:

    import { Directive, ElementRef, HostListener, HostBinding } from '@angular/core';
    
    @Directive({
      selector: '[credit-card]'
    })
    export class CreditCardDirective {
      constructor(private element: ElementRef) {}
    }

    Add a HostListener when user type input:

    And we want that the max length of string user type is 16 and it should be formatted as '6666 6666 6666 6666'.

      @HostListener('input', ['$event'])
      onKeyDown(event: KeyboardEvent) {
        this.border = "";
        const input = event.target as HTMLInputElement;
    
        // the length should be no more than 16
        let trimmed = input.value.replace(/s+/g, '');
        if(trimmed.length > 16) {
          trimmed  = trimmed.substr(0, 16);
        }
    
        // should be 6666 6666 6666 6666
        let numbers = [];
        for(let i = 0; i < trimmed.length; i +=4) {
          numbers.push(trimmed.substr(i, 4));
        }
    
        input.value = numbers.join(' ');
      }

    Now we want to use @HostBinding to change style props when what user entered is not a number:

      onKeyDown(event: KeyboardEvent) {
        this.border = "";
        const input = event.target as HTMLInputElement;
    
        // the length should be no more than 16
        let trimmed = input.value.replace(/s+/g, '');
        if(trimmed.length > 16) {
          trimmed  = trimmed.substr(0, 16);
        }
    
        // if we pass in char, show red border
        if((/[^d]/g).test(trimmed)) {
          this.border = '1px solid red';
        }
    
        // should be 6666 6666 6666 6666
        let numbers = [];
        for(let i = 0; i < trimmed.length; i +=4) {
          numbers.push(trimmed.substr(i, 4));
        }
    
        input.value = numbers.join(' ');
      }
  • 相关阅读:
    ArcGIS中的VBA修复
    ArcSDE解除图层锁定
    Sanboxie 5.14安装图解
    获取WIFI密码
    ArcGIS安装错误1402
    地图中插入表格——ArcMap篇
    mysql 5.6 datetime 保存精确到秒
    JAVA8 ARRAY、LIST操作 汇【5】)- JAVA8 LAMBDA LIST统计(求和、最大、最小、平均)
    cloud配置中心遇到的坑
    解决 MySQL 比如我要拉取一个消息表中用户id为1的前10条最新数据
  • 原文地址:https://www.cnblogs.com/Answer1215/p/6522464.html
Copyright © 2020-2023  润新知