【问题标题】:Ionic 3 input maskIonic 3 输入掩码
【发布时间】:2017-07-19 18:37:10
【问题描述】:

屏蔽ion-input 元素的最佳方法是什么?例如电话号码...类似这样的:

<ion-input type="tel" placeholder="celular" name="celular"
 [(ngModel)]="phone_number" required
 mask="(**)*****-****" ></ion-input>

【问题讨论】:

    标签: angular ionic-framework ionic3


    【解决方案1】:
    • 3 个步骤:

    • ==>1 - 创建指令。

    • ==>2 - 通过放入声明数组导入到主模块。
    • ==>3 - 使用 html 文件中的指令。

    步骤1

        import { Directive, Attribute } from '@angular/core';
        import { NgModel } from '@angular/forms';
        @Directive({
          selector: '[mask]',
          host: {
              '(keyup)': 'onInputChange($event)'
          },
          providers: [NgModel]
        })
        export class Mask {
            maskPattern: string;
            placeHolderCounts: number;
            dividers: string[];
            modelValue: string;
            viewValue: string;
    
            constructor(
                public model: NgModel,
                @Attribute("mask") maskPattern: string
            ) {
                this.dividers = maskPattern.replace(/\*/g, "").split("");
                this.dividers.push(" ");
                this.generatePattern(maskPattern);
        }
    
        onInputChange(event) {
            this.modelValue = this.getModelValue(event);
            let stringToFormat = this.modelValue;
            if (stringToFormat.length < 10) {
                stringToFormat = this.padString(stringToFormat);
            }
    
            this.viewValue = this.format(stringToFormat);
            this.writeValue(event.target, this.viewValue);
        }
    
        writeValue(target, value) {
            return target.value = value;
        }
    
        generatePattern(patternString) {
            this.placeHolderCounts = (patternString.match(/\*/g) || []).length;
            for (let i = 0; i < this.placeHolderCounts; i++) {
                patternString = patternString.replace('*', "{" + i + "}");
            }
            this.maskPattern = patternString;
        }
    
        format(s) {
            var formattedString = this.maskPattern;
            for (let i = 0; i < this.placeHolderCounts; i++) {
                formattedString = formattedString.replace("{" + i + "}",         s.charAt(i));
                }
                return formattedString;
            }
    
            padString(s) {
                var pad = "          ";
                return (s + pad).substring(0, pad.length);
            }
    
            getModelValue(event) {
                var modelValue = event.target.value;
                for (var i = 0; i < this.dividers.length; i++) {
                    while (modelValue.indexOf(this.dividers[i]) > -1) {
                        modelValue = modelValue.replace(this.dividers[i], "");
                    }
                }
                return modelValue;
            }
        }
    
    • 第二步

      import { Mask } from'./Mask';
      @NgModule({
        declarations: [
          MyApp,
          HomePage,
          Mask
      ],
      
    • 第三步

      <form>
          <ion-list>
            <ion-item>
              <ion-input type="text" mask="(**)****-****"></ion-input>
            </ion-item>
          </ion-list>
          <button ion-button block type="submit">Save</button>
        </form>
      

    【讨论】:

    • 感谢您的回答...您认为这是最好的方法吗?
    • 使用mask="******-****-******"删除前两组中的字符很痛苦:/
    • 一个简单而通用的功能需要大量代码。一定有更好的办法。
    猜你喜欢
    • 2018-02-21
    • 2018-02-21
    • 2015-09-18
    • 2020-08-15
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-10
    相关资源
    最近更新 更多