我有一个带有primefaces 4.0的JSF 2.2应用程序。我有一个带有一些checkbox的页面。我想要实现的是,当我点击一个复选框时,ajax请求将被触发到我的托管bean。该请求将触发一个返回字符串的方法。所以我不需要更新一个元素,但是要在js中找回字符串,因为如果我实现了那个,那么我可以返回一个JSON。
我有这段代码:
<p:selectManyCheckbox id="queues" value="#{viewAssignUsersMB.queueIds}" layout="grid" columns="3" converter="javax.faces.Long" converterMessage="Error.">
<f:selectItems value="#{viewAssignUsersMB.queues}"
var="queue"
itemValue="#{queue.id}"
itemLabel="#{queue.application.name}"/>
<p:ajax process="@this" partialSubmit="true" event="change" listener="#{viewAssignUsersMB.xxx()}" async="true" oncomplete="handleSaveRequest(xhr, status, args)"/>
和支持bean中的这个方法:
public void xxx(){
RequestContext.getCurrentInstance().addCallbackParam("stringToBePassed","TriluLilu");
}
和我的js回调方法:
function handleSaveRequest(xhr, status, args) {
alert('User with username ' +args.stringToBePassed+ ' is saved successfully');
}
我现在的主要问题是我不知道如何检测上次按下的复选框,因为在我的支持bean中我已经选中了所有复选框(#{viewAssignUsersMB.queueIds})...
有没有更好的方法,因为这是一个非常常见的场景/什么是&#34;经典&#34;实现这一目标的方法......?
答案 0 :(得分:0)
您可以使用remoteCommand实现此目的。
onchange
事件。<强> XHTML 强>
<p:selectCheckboxMenu id="selectCheckboxMenuId" widgetVar="selectCheckWV">
<f:selectItems value="#{mainBean.map}" />
</p:selectCheckboxMenu>
<p:remoteCommand name="submitNewCheckBoxValue"
process="@this selectCheckboxMenuId"
actionListener="#{mainBean.sendLastCheckedBox()}" />
<强> 的javascript 强>
<script>
$(document).ready(function() {
PF('selectCheckWV').inputs.change(function() {
if($(this).prop('checked'))
submitNewCheckBoxValue([{name: 'submitedValue', value: $(this).val()}]);
});
});
</script>
<强> managedBean 强>
public void sendLastCheckedBox() {
FacesContext facesContext = FacesContext.getCurrentInstance();
Map map = facesContext.getExternalContext().getRequestParameterMap();
String submitedValue = (String) map.get("submitedValue");
FacesMessage facesMessage = new FacesMessage(submitedValue);
facesContext.addMessage(null, facesMessage);
}
这是一个有效的Demo,以及github上的一个小例子[1] [2]
希望这有帮助。