#javascript #extjs4 #extjs
#javascript #extjs4 #extjs
Вопрос:
Я хочу реализовать проверку пароля с использованием расширенного VType в extjs, взятого изhttp://dev.sencha.com/deploy/ext-4.0.2a/examples/form/adv-vtypes.html , но похоже, что текстовое поле подтверждения пароля не проверяет текстовое поле смены пароля, если у подтверждения пароля нет значений (если значение пароля ‘test’, а значение подтверждения пароля пустое, тогда форма действительна). Я уверен, что это неправильно. Как сделать / заставить текстовое поле подтверждения пароля действительным / недействительным с помощью следующего условия:
- Если значение пароля не равно значению подтверждения пароля, то подтверждение пароля недопустимо (даже если значение подтверждения пароля пустое)
- Если значение пароля пустое, а значение подтверждения пароля пустое, то подтвердите, что пароль действителен
- Если значение пароля равно значению подтверждения пароля, то подтверждение пароля является действительным
Спасибо
Ответ №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. Как выполнить все условия, не игнорируя одно из этих трех? Потому что я хочу создать пользовательскую форму, которая может редактировать имя пользователя и / или пароль. но если пароль оставить пустым, предполагается, что пользователь не меняет пароль.