当我们使用向下滚动来选择素数的一个选项时,selectCheckboxMenu在更改监听器后,组件会更新并向上滚动,这种行为似乎是错误的。
这是我的代码:
XHTML
<p:outputLabel for="profCat" value="Professional Category" />
<p:selectCheckboxMenu id="profCat" widgetVar="profCatW"
scrollHeight="175"
label="#{employeeForm.profCat.label}"
value="#{employeeForm.profCat.selectedItemIds}">
<p:ajax event="toggleSelect" update="profCat"
listener="#{employeeForm.profCat.populateLabel}"
oncomplete="PF('profCatW').show()" />
<p:ajax event="change" update="profCat"
listener="#{employeeForm.profCat.populateLabel}"
oncomplete="PF('profCatW').show()" />
<f:selectItems value="#{employeeForm.profCat.items}" var="label"
itemLabel="#{label.label}" itemValue="#{label.optionId}" />
</p:selectCheckboxMenu>
<p:message for="profCat" />
Java监听器
public void populateLabel() {
label = (selectedItemIds != null && selectedItemIds.size() > 0)
? selectedItemIds.size() + " selected." : "Select";
}
java监听器更改了标签值,但我们需要更新selectCheckboxMenu来刷新此组合的标签。
有人知道要解决的解决方案吗?
- 更新后Javascript滚动重新定位
- 有什么方法可以避免刷新滚动
- 有没有办法在没有更新组件的情况下更新组合标签
- 其他JSF库的其他组件
我的B计划是从Java代码更新关联的outputLabel的文本,以避免这种行为。
提前感谢您!
问候
最后,我在@Kukeltje的帮助下解决了这个问题。
我定义了这个javascript函数:
function populateLabel(widgetVar) {
var count = PF(widgetVar).inputs.filter(":checked").length;
var label = count + " selected";
PF(widgetVar).jq.find('.ui-selectcheckboxmenu-label').text(label);
}
在我的JSF代码中,我删除了ajax监听器的更新:
<p:ajax event="toggleSelect"
listener="#{employeeForm.profCat.populateLabel}"
oncomplete="populateLabel('profCatW')" />
<p:ajax event="change"
listener="#{employeeForm.profCat.populateLabel}"
oncomplete="populateLabel('profCatW')" />
考虑验证过程中的错误情况:
<h:outputScript rendered="#{facesContext.validationFailed}">
populateLabel('profCatW');
</h:outputScript>