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(' ');
      }
  • 相关阅读:
    图文讲解ImageView的ScaleType
    android问题总结:
    芯片介绍
    js正则表达式中/=s*".*?"/g表示什么意思?
    fidder配置 https设置 手机客户端
    JAVAAndroid 多线程实现方式及并发与同步
    多线程之问题总结
    html_学习地址
    java保留小数后两位的四种写法
    Glide 加载部分圆角图片
  • 原文地址:https://www.cnblogs.com/Answer1215/p/6522464.html
Copyright © 2011-2022 走看看