XPages Type Ahead не работает при загрузке предложений

Мы используем элемент управления inputText XPages с Type Ahead для автоматического завершения. При вводе в поле поиска предложения не появляются. У нас есть список предложений, разделенных запятыми, установленный на панели свойств Type Ahead, а разделителем предложений является «,». Мы также пробовали использовать предложения, разделенные "новой строкой". Минимум символов "1". Вот xml для inputText:

<xp:inputText id="inputText2">
<xp:typeAhead mode="partial" minChars="1" ignoreCase="true" valueListSeparator=",">
    <xp:this.valueList><![CDATA[Homer,Marge,Bart,Lisa,Maggie]]></xp:this.valueList>
</xp:typeAhead>
</xp:inputText>

Использование режима «полный» и «частичный» не работает, но с разными ошибками. При использовании «полного» на каждую букву, введенную в поле поиска, в консоли браузера появляются следующие ошибки (да, все они вызваны одним нажатием клавиши):

Error: Unable to load undefined status:404
dijit.form.ComboBox: Error: Unable to load undefined status:404
Error: Unable to load undefined status:404
Error: Unable to load undefined status:404
Error: Unable to load undefined status:404

Аналогично для режима "partial" для каждой введенной буквы появляется следующее сообщение об ошибке:

'url' is null or not an object

Эта последняя ошибка возникает в dojo.js (уменьшенная версия, используемая с Lotus Notes 8.5.3, строка 14, символ 84996). Мы не уверены, какая это версия dojo, потому что она не указана в минимизированном скрипте, но мы думаем, что Версия 1.6.1 примерно правильная версия. Мы изолировали код, который вызывает ошибку:

dojo._ioAddQueryToUrl = function(/*dojo.__IoCallbackArgs*/ioArgs){
    //summary: Adds query params discovered by the io deferred construction to the URL.
    //Only use this for operations which are fundamentally GET-type operations.
    if(ioArgs.query.length){
        ioArgs.url += (ioArgs.url.indexOf("?") == -1 ? "?" : "&") + ioArgs.query;
        ioArgs.query = null;
    }
};

Именно ioArgs.url += ... вызывает ошибку.

Сгенерированная разметка для inputText выглядит следующим образом:

<span id="view:_id36:_id38:_id119" dojotype="ibm.xsp.widget.layout.data.TypeAheadReadStore" jsid="view__id36__id38__id119" mode="full"></span>
<div class="dijit dijitReset dijitInlineTable dijitLeft xspInputFieldEditBox dijitTextBox dijitComboBox" id="widget_view:_id36:_id38:inputText2" role="combobox" widgetid="view:_id36:_id38:inputText2">
<div class="dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton dijitArrowButtonContainer" dojoattachpoint="_buttonNode, _popupStateNode" role="presentation" style="display: none;">
    <input class="dijitReset dijitInputField dijitArrowButtonInner" value="? " type="text" tabindex="-1" readonly="readonly" role="presentation">
</div>
<div class="dijitReset dijitValidationContainer">
    <input class="dijitReset dijitInputField dijitValidationIcon dijitValidationInner" value="? " type="text" tabindex="-1" readonly="readonly" role="presentation">
</div>
<div class="dijitReset dijitInputField dijitInputContainer">
    <input class="dijitReset dijitInputInner" name="view:_id36:_id38:inputText2" type="text" autocomplete="off" dojoattachpoint="textbox,focusNode" role="textbox" aria-haspopup="true" id="view:_id36:_id38:inputText2" tabindex="0" value="">
</div>
</div>

Любые предложения (каламбур) будут очень признательны!


person Øystein Grande Jaren    schedule 27.11.2012    source источник
comment
нажмите F12 и найдите сетевой трафик, затем проверьте, какой URL/запрос вызывает ошибку 404.   -  person Frantisek Kossuth    schedule 27.11.2012
comment
И проверьте, почему вы получаете сообщение об ошибке dijit.form.ComboBox. У вас есть ComboBox на той же странице, которая не работает? Попробуйте удалить этот ComboBox из XPage и посмотрите, что произойдет.   -  person Per Henrik Lausten    schedule 27.11.2012
comment
@FrantisekKossuth Запрос, вызывающий ошибку (с анонимными именами серверов и баз данных): http://‹hostname›.com/‹databasename›.nsf/undefined .   -  person Øystein Grande Jaren    schedule 27.11.2012
comment
1) в URL нет .xsp - просто мысль: если ваша страница открывается по свойству автозапуска, адресная строка не содержит путь + nsf и имя xpage. попробуйте свою страницу с полным адресом в адресной строке 2) undefined - кажется, что-то не инициализировано. это может быть имя страницы или неопределенная переменная запроса... попробуйте сначала исправить первый шаг.   -  person Frantisek Kossuth    schedule 27.11.2012
comment
@PerHenrikLausten Ничто другое на странице не использует ComboBox. Я предполагаю, что это то, что Type Ahead использует для отображения списка предложений по мере ввода. Родительский div поля ввода имеет класс dijitComboBox, а также role='combobox'. Все это генерируется Type Ahead.   -  person Øystein Grande Jaren    schedule 27.11.2012
comment
Похоже, что свойство url ibm.xsp.widget.layout.data.TypeAheadReadStore инициализировано неправильно. Работают ли другие вызовы dojo.xhr (частичные обновления и т. д.) на XPage? Какое значение установлено для свойства action (созданного элемента формы)?   -  person Sven Hasselbach    schedule 27.11.2012
comment
@SvenHasselbach Мы не используем никакие другие вызовы dojo.xhr на странице. На самом деле элемента формы нет. Я просто добавил сгенерированную разметку в исходный пост.   -  person Øystein Grande Jaren    schedule 27.11.2012
comment
@Øystein Джарен Самуэльсен: Я только что обнаружил, что мой хром показывает ту же ошибку - server/nsf/undefined. К моему удивлению, это было вызвано вредоносной программой Complitly или Widdit. Дважды проверьте свой компьютер на наличие этого...   -  person Frantisek Kossuth    schedule 29.11.2012


Ответы (1)


Пожалуйста, проверьте свойство XPages createForm. Если установлено значение false, удалите его или измените на true.

<xp:view xmlns:xp="http://www.ibm.com/xsp/core" createForm="true">

Функция опережающего ввода вычисляет целевой URL из свойства action HTML-формы. Если эта форма недоступна, тип впереди завершается ошибкой. Если вам нужно отключить автоматически сгенерированную форму, вы должны вручную добавить форму в XPage.

Изменить:

В качестве альтернативы вы можете перезаписать код CSJS хранилища данных Typeahead и манипулировать методом fetch, чтобы внедрить URL вашего XPage.

Редактировать 2:

Вот блок скрипта, который исправляет ввод:

<xp:scriptBlock id="scriptBlockFixTypeAhead">
    <xp:this.value>
        <![CDATA[dojo.addOnLoad(function(){
            ibm.xsp.widget.layout.data.TypeAheadReadStore.prototype.fetch = function tars_f(_5) {
            var _6 = _5.query.name;
            if (_6.length < this.minChars) {
                _5.onComplete([], _5);
                return;
            }
            this.content.$$value = _6;
            var _7 = {url: '#{javascript:context.getUrl().getPath()}', 
               handleAs: "text", timeout: XSP.submitLatency, content: this.content,
               form: this.sendForm ? this.formId : null, 
               load: dojo.hitch(this, this.retrieved, _5),
               error: dojo.hitch(_5, _5.onError)};
            dojo.xhr(this.method, _7, !this.contentInUrl);
            return _5;
        }})
    ]]></xp:this.value>
</xp:scriptBlock>
person Sven Hasselbach    schedule 27.11.2012
comment
Спасибо за ответ. createForm действительно был установлен на false на нашей странице. Установка значения true устраняет часть проблемы, но конфликтует с другими функциями на нашей странице. Добавление элемента формы вручную также проблематично. Нам придется вернуться к этому вопросу позже, так как сейчас у нас нет времени. - person Øystein Grande Jaren; 28.11.2012
comment
@Øystein Джарен Самуэльсен: я добавил еще один обходной путь, жесткий взлом кода CSJS. Просто добавьте блок скрипта на свою страницу. Надеюсь это поможет. - person Sven Hasselbach; 28.11.2012