Autocomplete 加载建议时XPages Type-Ahead失败

Autocomplete 加载建议时XPages Type-Ahead失败,autocomplete,lotus-notes,xpages,type-ahead,Autocomplete,Lotus Notes,Xpages,Type Ahead,我们正在使用一个inputText XPages控件,该控件具有提前输入功能,用于自动完成。在搜索字段中键入时,不会显示任何建议。我们在“提前键入属性”窗格中设置了逗号分隔的建议列表,建议分隔符为“,”。我们还尝试使用“新线”——分开的建议。最小字符数为“1”。以下是inputText的xml: <xp:inputText id="inputText2"> <xp:typeAhead mode="partial" minChars="1" ignoreCase="true" v

我们正在使用一个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>
与“部分”模式类似,键入的每个字母都会显示以下错误消息:

'url' is null or not an object
最后一个错误源于dojo.js(LotusNotes8.5.3第14行字符84996的简化版本)。我们不确定这是dojo的哪个版本,因为它没有在缩小的脚本中说明,但我们认为这大概是正确的版本。我们已隔离导致错误的代码:

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>


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

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


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

编辑:

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

编辑2:

以下是修复typeahead的脚本块:

<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>


点击F12并查找网络流量,然后检查导致错误404的url/请求。并检查为什么会收到关于dijit.form.ComboBox的错误消息。在同一页上是否有失败的组合框?尝试从XPage中删除该组合框,看看会发生什么。@FrantisekKossuth导致错误的请求是(服务器和数据库名称匿名):http://.com/.nsf/undefined .1)url中没有.xsp-只是想一想:如果您的页面是通过autolaunch属性打开的,则地址栏不包含path+nsf和xpage名称。在地址栏中的完整url未定义的情况下尝试您的页面-似乎有些内容未初始化。它可能是页面名称,也可能是未定义的查询变量。。。请先尝试修复第一步。@PerHenrikLausten页面上没有其他内容使用ComboBox。我猜这就是Typeahead在您键入时用来显示建议列表的方式。输入字段的祖父母div有一个类“dijitComboBox”,以及“role='combobox'”。这都是通过提前输入生成的。谢谢您的回复。createForm在我们的页面上确实设置为false。将其设置为true可以修复部分问题,但它与页面上的其他功能冲突。手动添加表单元素也有问题。我们稍后将不得不回到这个问题上来,因为我们现在没有时间了。@伊斯坦·贾伦·萨缪尔森:我添加了另一个解决方法,一个对CSJS代码的硬破解。只需将脚本块添加到页面中。希望这有帮助。
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" createForm="true">
<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>