Требуется усовершенствование расширенного VType для проверки пароля на extjs4

#javascript #extjs4 #extjs

#javascript #extjs4 #extjs

Вопрос:

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

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

Спасибо

Ответ №1:

Хорошо, похоже, я решил свою собственную проблему. Как сказал 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 amp;amp; !regex.test(value)) {
            errors.push(me.regexText || me.invalidText);
        }

        return errors;
    }
});
  

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

Ответ №2:

В поисках помощи по вашему сообщению я нашел простое решение. Начиная с упомянутого примера 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)

Ответ №3:

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

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

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

Вот демо.

Комментарии:

1. Как выполнить все условия, не игнорируя одно из этих трех? Потому что я хочу создать пользовательскую форму, которая может редактировать имя пользователя и / или пароль. но если пароль оставить пустым, предполагается, что пользователь не меняет пароль.