【发布时间】:2014-08-13 17:46:44
【问题描述】:
我有一个具有简单搜索功能的 XPage。
简单搜索由一个组合框组成,该组合框表示包含要搜索的信息的项目的名称,以及一个文本框输入字段,用户可以在其中输入要搜索的值。
“过滤器”组合框包含“RecordID”、“请求者”、“受让人”等内容。
当用户选择过滤器并键入要搜索的词并按回车键时,将在服务器上执行搜索并正确返回结果。例如,如果用户选择“RecordID”并输入“ABCD”并按回车键,则将返回 RecordID 字段中包含“ABCD”的所有结果记录。如果用户选择“请求者”并输入“Joe Smith”,则返回请求者字段中包含“Joe Smith”的所有记录。这很好用。
我的问题是当我尝试将预先输入添加到值字段时。预输入有效,但仅过滤组合框的 LAST SUBMITTED 值。示例:如果用户选择“RecordID”并且最后一次搜索是使用“RecordID”执行的,那么在他们输入信息时,预输入将正确过滤 RecordID 结果。如果用户将过滤器更改为“请求者”并开始输入名称,则不会返回结果。如果他们按 Enter 键并根据 Requestor 返回结果,然后清除 value 字段并开始输入另一个 Requestor 的名称,则 typeahead 工作正常。
我很确定问题是由于我不知道如何在 typeahead 事件期间访问组合框的值。我的代码如下(使用 println 语句尝试确定组合框的值。.value 属性和 .getValue() 方法都返回组合框的先前提交的值。.getSubmittedValue() 属性是返回 null。
<xp:comboBox
id="simpleSearchFilter1"
value="#{XSPrequestSearcher.simpleSearchFilter}">
<xp:selectItems
value="#{XSPrequestSearcher.simpleSearchChoices}" />
</xp:comboBox>
<xp:inputText
id="simpleSearchValue1"
value="#{XSPrequestSearcher.simpleSearchValue}">
<xp:typeAhead
mode="partial"
valueMarkup="true"
var="searchfor"
minChars="3">
<xp:this.valueList><![CDATA[#{javascript:var obj = getComponent("simpleSearchFilter1");
var value = obj.value;
var gvalue = obj.getValue();
var svalue = obj.getSubmittedValue();
println("***********");
println("simpleSearchValue1.typeahead");
println("\t value: " + value);
println("\t gvalue: " + gvalue);
println("\t svalue: " + svalue);
XSPrequestSearcher.setSimpleSearchFilter(getComponent("simpleSearchFilter1").value);
XSPrequestSearcher.getTypeaheadChoicesSimple(searchfor); }]]></xp:this.valueList>
</xp:typeAhead>
<xp:eventHandler
event="onchange"
submit="true"
refreshMode="partial"
refreshId="#{compositeData.partialRefreshTargetID}">
<xp:this.script>
<xp:executeClientScript>
<xp:this.script><![CDATA[return !isBlank("#{id:simpleSearchValue1}");]]></xp:this.script>
</xp:executeClientScript>
</xp:this.script>
<xp:this.action><![CDATA[#{javascript:XSPrequestSearcher.setSimpleSearchFilter(getComponent("simpleSearchFilter1").value);}]]></xp:this.action>
</xp:eventHandler>
</xp:inputText>
【问题讨论】:
-
是否可以将 simpleSearchFilter1 绑定到作用域变量,并引用作用域变量?或者,如果它绑定到 java bean,则引用 bean 而不是 getComponent。不知道这是否会有所作为,但值得一试。
-
绑定到 Bean 上的变量属性。我还在作用域变量上进行了尝试。问题是它不会更新,除非我为我真的不想做的 on change 事件设置提交。
-
很确定你试过了。也许试试这个,在 onClick 事件中,让客户端代码使用 XSP.PartialRefreshPost 将字段的当前值写回服务器,并将其设置为范围变量或您可以访问它的地方。
-
问题是,如果您不将所选项目发送回服务器,您的预输入将永远不会知道用户选择了哪个项目。因此,在用户开始在您的搜索字段中输入之前,您必须通过 Ajax 将选择发送到服务器并将过滤后的项目返回给客户端。将 Serdars 解决方案用于最小的 onchange 事件,但我确定您必须刷新搜索字段或至少刷新输入。
标签: javascript combobox xpages client-side typeahead