加载建议时,XPages Type Ahead失败

Øys*_*ren 5 lotus-notes autocomplete type-ahead xpages

我们使用带有Type Ahead的inputText XPages控件进行自动完成.在搜索字段中输入内容时,不会显示任何建议.我们在"预输入类型"属性窗格中设置了以逗号分隔的建议列表,建议分隔符为",".我们也尝试过使用"新线"分离的建议.最小字符为"1".这是inputText的xml:

<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>
Run Code Online (Sandbox Code Playgroud)

使用"完整"和"部分"模式都会失败,但会出现不同的错误.使用"full"时,对于在搜索字段中键入的每个字母,浏览器控制台中会显示以下错误(是的,所有这些都是由单键按下引起的):

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
Run Code Online (Sandbox Code Playgroud)

类似地,对于模式"部分",为每个键入的字母显示以下错误消息:

'url' is null or not an object
Run Code Online (Sandbox Code Playgroud)

最后一个错误源自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;
    }
};
Run Code Online (Sandbox Code Playgroud)

这是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>
Run Code Online (Sandbox Code Playgroud)

任何建议(双关语)将不胜感激!

Sve*_*ach 4

请检查 XPage 属性createForm。如果设置为false,请将其删除或更改为true

<xp:view xmlns:xp="http://www.ibm.com/xsp/core" createForm="true">
Run Code Online (Sandbox Code Playgroud)

Type Ahead 功能根据HTML 表单的操作属性计算目标 URL。如果此表单不可用,则前面的输入将失败。如果需要禁用自动生成的表单,则必须手动将表单添加到 XPage。

编辑:

或者,您可以覆盖 Typeahead 数据存储的 CSJS 代码并操作fetch方法来注入 XPage 的 URL。

编辑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>
Run Code Online (Sandbox Code Playgroud)