Autocomplete 加载建议时XPages Type-Ahead失败
我们正在使用一个inputText XPages控件,该控件具有提前输入功能,用于自动完成。在搜索字段中键入时,不会显示任何建议。我们在“提前键入属性”窗格中设置了逗号分隔的建议列表,建议分隔符为“,”。我们还尝试使用“新线”——分开的建议。最小字符数为“1”。以下是inputText的xml: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
<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>