zoukankan      html  css  js  c++  java
  • [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(' ');
      }
  • 相关阅读:
    两个数组的交集
    左叶子之和
    下载安装python
    占位
    2020 软件工程实践 助教总结
    安装使用 QEMU-KVM 虚拟化环境(Arch Linux / Manjaro / CentOS / Ubuntu )
    #69. 新年的QAQ
    1097E. Egor and an RPG game(Dilworth定理)
    #553. 【UNR #4】己酸集合
    #2099. 「CQOI2015」标识设计(插头dp)
  • 原文地址:https://www.cnblogs.com/Answer1215/p/6522464.html
Copyright © 2011-2022 走看看