WedX - журнал о программировании и компьютерных науках

ExtJS findExact() и ошибка пользовательского валидатора

Я использую собственный валидатор в своем поле со списком:

function(v) {
    console.log(v === 'some value I know for SURE is in the store'); // (1)
    var index = this.getStore().findExact(this.displayField, v);
    return (index!==-1) ? true : 'Invalid selection';
}

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

Однако; У меня очень странные результаты с findExact(). Например, если значение поля со списком в настоящее время действительно, а пользователь нажимает пробел + возврат, валидатор отказывается, даже если вывод из (1) истинно.

Любые идеи, что вызывает проблему? Конечный опыт в настоящее время очень глючный.

10.11.2013

Ответы:


1

Когда вы вводите дополнительное пространство, хранилище фильтруется. После того, как вы нажмете клавишу Backspace и сработает валидатор, хранилище по-прежнему пусто.

Если у вас есть локальный магазин, вы можете проверять комбо с некоторой задержкой после каждого изменения. Пример:

listeners: {
    change: function() {
        this.validate();
    },
    delay: 100
}

Этого должно быть достаточно.

С другой стороны, если у вас есть удаленное хранилище, попробуйте что-то вроде этого:

validator: function(v) {
    var store = this.getStore(),
        index = store.findExact(this.displayField, v);

    if (index === -1 && store.isLoading()) {
        store.on('load', function() {
            this.validate();
        }, this, { single: true, delay: 100 });
    }

    return (index !== -1) ? true : 'Invalid selection';
}
10.11.2013
  • Вы правы в отношении фильтра, применяемого к магазину. delay не исправить это; однако вызов clearFilter() сделал 11.11.2013

  • 2

    У меня была аналогичная проблема, и я нашел эту запись. Моя проблема заключалась в том, что я повторно использовал один и тот же экземпляр хранилища в нескольких ComboBox. После предоставления каждому ComboBox собственного хранилища с клонированными данными все было нормально. См. также: https://www.sencha.com/forum/showthread.php?305182-ComboBox-forceSelection-clears-input&p=1127218&viewfull=1#post1127218

    04.02.2016

    3

    Я просто потратил несколько дней на эту проблему и нашел действительно отличное решение (правда, случайно). Вы можете, как предполагает принятый ответ, использовать предоставленную функцию validator; однако, насколько я понимаю, существует гораздо более простое решение, чем дает принятый ответ: оценка того, соответствует ли введенный пользователем ввод значению в хранилище (что является основным вопросом в исходном сообщении).

    Преимущество такого подхода к вводу заключается в том, что он позволяет нам обрабатывать вариант использования недопустимого значения, введенного пользователем (проверено; нет значения), и — после того, как поле теряет фокус — Ext JS возвращает поле в исходное состояние. предыдущее значение (которое запоминает свое сохраненное значение).

    Это совершенно другой путь, чем вы думаете, но он должен работать, особенно когда .validate() работает независимо от того, предоставляете ли вы реализацию процедуры validator:

    validator : function(someParam) {
        if(this.value === null) {
            return "error message"; //falsy
        } else {
            return true;
        }
    }
    

    Если вы включите forceSelection, вышеописанное работает очень хорошо и избавляет от ощущения глючности. Это позволяет вам полагаться на .validate, чтобы делать свою магию в другом месте (заметьте, я даже не вызываю его; прочитайте документ, чтобы выяснить, когда он вызывается по отношению к validator), и вам не нужно беспокоиться о том, что пользователь правильно объясняет в принятый ответ.

    16.02.2015
  • Привет, Томас, ты тоже говоришь о ext4 или выше? 04.02.2016

  • 4

    У нас возникли проблемы с принудительной очисткой пользовательского текста до того, как он закончил печатать. Казалось, мы получили то, что нам было нужно, установив forceSelection в false и просто проверив, что они что-то выбрали.

    validator: function(v) {
        if (this.getSelection() === null) {
            return 'invalid text';
        }else{
            return true;
        }
    }
    
    10.12.2015
    Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]