Маска ввода для текстового поля ExtJs 6

У меня есть маска текстового поля в ExtJs 4. Это можно найти здесь

Может кто-нибудь указать мне в направлении примера текстовой маски в ExtJs6.

0 ответов

Я написал простое замаскированное текстовое поле для ExtJS 6.2. Все, что вам нужно сделать, это создать файл с именем MaskedField.js и вставьте следующий код:

Ext.define('Ext.field.MaskedField', {
    extend: Ext.field.Text,
    alias: 'widget.maskedfield',
    config: {
        label: '',
        mask: null,
        defaultDateFormat: 'm/d/Y'
    },

    initialize: function() {
        const me = this;

        me.callParent();

        if (Ext.String.trim(me.config.mask) != "") me.setMaxLength(me.config.mask.length);
    },

    listeners: {
        change: function(textfield, newValue, oldValue, eOpts) {
            if (newValue instanceof Date) newValue = Ext.Date.format(newValue, textfield.config.defaultDateFormat);
            if (isFinite(newValue)) newValue = String(newValue);
            if (oldValue && newValue.length < oldValue.length) return; // Backspace pressed

            let mask = textfield.config.mask;
            if (!mask) return; // Avoid auto-bind error
            let mf = mask.split('');
            let vf = newValue.replace(/[^0-9]/g, '').split(''); // Mask for numbers only
            let index = 0;
            mf.map((m, i) => {
                if (m === '#') {
                    mf[i] = vf[index++];
                }
            });

            let value = '';
            for (m of mf) {
                if (m) {
                    value += m;
                } else {
                    break;
                }
            }

            textfield.suspendEvent('change');
            textfield.setValue(value);
            textfield.resumeEvent('change');
        }
      }
});

Этот компонент не проверяет какие-либо данные. Это только дает пользователю возможность печатать с автоматической маскировкой.

Вы не можете использовать числа как часть маски (она принимает только специальные символы, пробелы и буквы). Маска '## 9###' потерпит неудачу, но '## A###' будет работать нормально!

Вы можете использовать этот компонент следующим образом:

{
  xtype: 'maskedfield',
  name: 'birthday',
  label: 'Your birthday',
  mask: '##/##/####',
  defaultDateFormat: 'd/m/Y' // Same format as Ext.Date
},
{
  xtype: 'maskedfield',
  name: 'phone',
  label: 'Your cellphone',
  mask: '(##) #####-####'
},
{
  xtype: 'maskedfield',
  name: 'postalcode',
  label: 'Postal code',
  mask: '#####-###'
}

Вы должны объявить маску, используя '#'.

Другие вопросы по тегам