如何解决ace:autoCompleteEntry 事件侦听器无法更改另一个 ace:autoCompleteEntry 值
我使用的是 icefaces 3.3 并且我有一个带有 ace:dataTable 和 3 列的 JSF 页面。
我可以点击一个按钮在表格中添加一个新行。该行将在第一列中包含一些用于确认/删除/取消插入行的按钮,以及在最后两列中的两个 ace:autoCompleteEntry。
当我更改 ace:autoCompleteEntry 的值时,我想填充另一个。
这是我的 JSF 代码:
<ace:dataTable id="mccTable"
value="#{controller.list}"
var="elem" style="font-size:12px"
reorderableColumns="false" resizableColumns="false" doubleClickSelect="false"
staticHeaders="true" clickableHeaderSorting="true" paginator="true"
paginatorPosition="bottom" pageCount="10" rows="10">
<ace:column id="colOptButtons" style="padding-left:10px; text-align:left; width: 6%;">
<h:commandButton id="saveBtn" type="button"
action="#{controller.save(elem)}"
image="#{resource['save.png']}">
<f:ajax execute="@form" render="@all" immediate="true"/>
</h:commandButton>
<h:commandButton id="cancelBtn" type="button"
action="#{controller.cancel(elem)}"
image="#{resource['cancel.png']}"
immediate="true">
<f:ajax execute="@form" render="@all" immediate="true"/>
</h:commandButton>
<h:commandButton id="removeBtn" type="button"
action="#{controller.delete(elem)}"
image="#{resource['delete.png']}">
<f:ajax execute="@form" render="@all" immediate="true"/>
</h:commandButton>
</ace:column>
<ace:column id="nameCol" style="text-align:left; width: 42%;" headerText='Some header'>
<ace:autoCompleteEntry id="ac1" value="#{elem.name}" width="300" minChars="2"
hideEffect="puff" showEffect="puff" delay="1000" height="100"
styleClass="textstd" rows="10" size="30" direction="down"
indicatorPosition="right"
style="#{component.valid ? '' : 'border-color:red; border-style:solid; border-width:thin; font-weight: normal;'}">
<f:selectItems value="#{controller.nameList}"/>
<f:validateBean disabled="false"/>
<ace:ajax execute="@this" render="@all" listener="#{controller.nameChanged(elem)}"/>
</ace:autoCompleteEntry>
</ace:column>
<ace:column id="desCol" style="text-align:left; width: 52%;" headerText='Some header'>
<ace:autoCompleteEntry id="ac2" value="#{elem.des}" width="300"
hideEffect="puff" showEffect="puff" delay="1000" height="100"
styleClass="textstd" rows="10" size="30" direction="down"
indicatorPosition="right"
style="#{component.valid ? '' : 'border-color:red; border-style:solid; border-width:thin; font-weight: normal;'}">
<f:selectItems value="#{controller.desList}"/>
<f:validateBean disabled="false"/>
<ace:ajax execute="@this" render="@all" listener="#{controller.desChanged(elem)}"/>
</ace:autoCompleteEntry>
</ace:column>
</ace:dataTable>
这是我的 java 控制器 bean 侦听器代码:
public void desChanged(Elem elem) {
elem.setName(null);
if(StringUtils.isNotBlank(elem.getDes())) {
// retrieve name by des ...
opt.ifPresent(elem2 -> elem.setName(elem2.getName()));
}
}
public void nameChanged(Elem elem) {
elem.setDes(null);
if(StringUtils.isNotBlank(elem.getName())) {
// retrieve des by name ...
opt.ifPresent(elem2 -> elem.setDes(elem2.getDes()));
}
}
当 ace:autoCompleteEntry 的值发生变化时,监听器会被正确触发。
但是其他 ace:autoCompleteEntry 的值只有在最初为空时才会更改。因此,如果我在另一个 ace:autoCompleteEntry 已经填充时开始输入,则组件值不会在视图中更新,而只会在控制器值上更新。为了让它工作,我必须在开始输入另一个组件之前清除组件内容。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。