Требуется расширенный VType для проверки пароля в extjs4 - PullRequest
3 голосов
/ 09 октября 2011

Я хочу реализовать проверку пароля с использованием расширенного VType для extjs, взятых из http://dev.sencha.com/deploy/ext-4.0.2a/examples/form/adv-vtypes.html,, но похоже, что текстовое поле подтверждения пароля не проверяется при изменении текстового поля пароля, если подтверждение пароля не имеет значений(если значение пароля 'test' и подтверждение, что значение пароля пустое, то форма действительна).Я уверен, что это не правильно.Как сделать / заставить текстовое поле подтверждения пароля быть действительным / недействительным при следующих условиях:

  1. Если значение пароля не равно значению подтверждения пароля, то подтверждение пароля является недействительным (даже если значение подтверждения пароля пустое))
  2. Если значение пароля пустое и подтвердить, что значение пароля пустое, то подтвердить, что пароль действителен
  3. Если значение пароля равно значению для подтверждения пароля, подтвердить пароль действителен

Спасибо

Ответы [ 3 ]

2 голосов
/ 13 октября 2011

Хорошо, похоже, я решил свою проблему.Как сказал Molecule Man, это не может быть достигнуто (легко).

Мне нужно переопределить Ext.form.field.Text.getErrors, чтобы решить, что

Ext.form.field.Text.override({
    getErrors: function(value) {
        var me = this,
            errors = me.callParent(arguments),
            validator = me.validator,
            emptyText = me.emptyText,
            allowBlank = me.allowBlank,
            vtype = me.vtype,
            vtypes = Ext.form.field.VTypes,
            regex = me.regex,
            format = Ext.String.format,
            msg;

        value = value || me.processRawValue(me.getRawValue());

        if (Ext.isFunction(validator)) {
            msg = validator.call(me, value);
            if (msg !== true) {
                errors.push(msg);
            }
        }

        if (value.length < 1 || value === emptyText) {
            if (!allowBlank) {
                errors.push(me.blankText);
            }
            //FIX BY ME : NEED TO COMMENT THIS BECAUSE ITS CAN IGNORING VTYPE AS ITS IMMEDIATELY RETURN ERRORS
            //return errors;
        }

        if (value.length < me.minLength) {
            errors.push(format(me.minLengthText, me.minLength));
        }

        if (value.length > me.maxLength) {
            errors.push(format(me.maxLengthText, me.maxLength));
        }

        if (vtype) {
            if(!vtypes[vtype](value, me)){
                errors.push(me.vtypeText || vtypes[vtype +'Text']);
            }
        }

        if (regex && !regex.test(value)) {
            errors.push(me.regexText || me.invalidText);
        }

        return errors;
    }
});

Вот полный код http://jsfiddle.net/gajahlemu/SY6WC/

1 голос
/ 02 марта 2012

Обращаясь за помощью к вашему сообщению, я нашел простое решение. Начиная с упомянутого extjs4 примера достаточно добавить следующий слушатель 'onchange' в поле 'pass' (... это копия вашего решения + еще одна строка):

listeners: {  
    change: function(field) {  
        var confirmField = field.up('form').down('[name=pass-cfrm]');  
        confirmField.allowBlank = (field.value == '');  // <- the change is here
        confirmField.validate();  
    }  
},  

Свойство allowBlank поля pass-cfrm динамически изменяется в соответствии со значением поля pass. Если поле 'pass' пустое, тогда pass-cfrm является необязательным (allowBlank = true), в противном случае оно является обязательным (allowBlank = false)

0 голосов
/ 12 октября 2011

Второй пункт не может быть достигнут (легко). Потому что для обоих входов потребуется установить для параметра allowBlank значение true. И allowBlank имеет более высокий приоритет, чем vtypes. Таким образом, в случаях, когда одно поле пустое, а второе не пустое, пустое поле будет действительным (тогда как оно должно быть недействительным) из-за allowBlank: true.

Если мы оставим второй пункт, решение может быть очень простым:

  • добавить allowBlank: false в оба поля;
  • подтвердить поле подтверждения в поле пароля change

Вот демо .

...