p:calendar ui:repeat / h:dataTable 中的错误,无法获取选定的索引
p:calendar bugs in ui:repeat / h:dataTable, can't get selected index
我得到了一个 ui:repeat,其中有几个带有动作监听器的输入元素,如果用户编辑了这些元素,我想更改它们的样式。
我知道通过 ui:repeat 我们对服务器端和客户端的组件有不同的范围。因此我想获取选定的循环索引或元素的 clientID 以调用 javascript 函数来更改样式。
这适用于我的 selectOneMenu,我使用 ajax 调用一个方法并获得正确的 clientID。但是如果我用我的日历尝试同样的事情,我总是得到 ui:repeat 循环的最后一个元素/索引,而不是选定的...
我的jsf:
<ui:repeat var="carservice" value="#{searchCarProject.editProjects}" varStatus="loop" id="repeat">
<p:selectOneMenu id="menu1" value="#{carservice.carProject.brand}" style="width:38px !important;">
<f:selectItem itemLabel="" itemValue="" />
<f:selectItems value="#{searchCarProject.carProjectBeanService.brands}" var="i" itemLabel="#{i.value} - #{i.label}" itemValue="#{i}"/>
<p:ajax event="change" listener="#{searchCarProject.menuSelect}" update="errorGrid innerGrid " partialSubmit="true"/>
<f:converter binding="#{mlCarProjectAttributeConverter}" />
</p:selectOneMenu>
<p:calendar id="cal1" widgetVar="deDateWidget" pattern="dd.MM.yyyy" value="#{carservice.carProject.termin_de}" mindate="#{searchCarProject.currentDate}" navigator="true">
<p:ajax event="dateSelect" listener="#{searchCarProject.calSelect}"/>
</p:calendar>
</ui:repeat>
我的服务器方法:
//for selectOneMenues
public void menuSelect(final AjaxBehaviorEvent event) {
final String id = event.getComponent().getClientId();
//id = selectionForm:entryActionTabs:repeat:0:menu1 <- 0 = the right selected one
}
//for calendar
public void calSelect(final AjaxBehaviorEvent event) {
final String id = event.getComponent().getClientId();
//id = selectionForm:entryActionTabs:repeat:5:cal1 <- always 5 = always the last index
}
所以在活动结束后不会给我正确的日历值,我想我应该尝试使用 var 属性:
<p:calendar id="de_calendar" widgetVar="deDateWidget" pattern="dd.MM.yyyy" value="#{carservice.carProject.termin_de}" mindate="#{searchCarProject.currentDate}" navigator="true">
<f:ajax event="dateSelect" listener="#{searchCarProject.calSelectWithAttributes(**loop.index,carservice.carProject.name**)}"/>
</p:calendar>
但我仍然只得到最后的值,如果我对 selectOneMenu 做同样的事情,我会得到选定的值...
public void calSelectWithAttributes(final int index, final String name) {
index = always 5 = always the last index, name = obj name, is always the last one same as index
}
所以我不知道为什么 selectOneMenu 给我正确的 loop.index / 属性 / 事件,但只有日历总是最后...
编辑:甚至用 h:dataTable 尝试过,完全相同的问题...Ajaxevent returns 始终是日历的最后一个 ID。
看来日历只是有问题,尝试了很多其他 primefaces 组件,除日历外一切正常...
所以我放弃了解决该问题的常规方法。我注意到例如 onclick="jsMethod(this)" 将通过 javascript 获取 id。所以现在我调用我的 js 方法,获取 id,触发远程命令并从远程命令方法读取保存的值。这是一个丑陋的解决方法,但我想不出比这更好的方法了。
你可以在这里找到一个例子:http://blogs.bytecode.com.au/glen/2013/09/25/calling-primefaces-remotecommand-with-javascript-arguments.html
当您使用 ui:repeat
时,删除 p:calendar
中的 widgetVar="deDateWidget"
我得到了一个 ui:repeat,其中有几个带有动作监听器的输入元素,如果用户编辑了这些元素,我想更改它们的样式。
我知道通过 ui:repeat 我们对服务器端和客户端的组件有不同的范围。因此我想获取选定的循环索引或元素的 clientID 以调用 javascript 函数来更改样式。
这适用于我的 selectOneMenu,我使用 ajax 调用一个方法并获得正确的 clientID。但是如果我用我的日历尝试同样的事情,我总是得到 ui:repeat 循环的最后一个元素/索引,而不是选定的...
我的jsf:
<ui:repeat var="carservice" value="#{searchCarProject.editProjects}" varStatus="loop" id="repeat">
<p:selectOneMenu id="menu1" value="#{carservice.carProject.brand}" style="width:38px !important;">
<f:selectItem itemLabel="" itemValue="" />
<f:selectItems value="#{searchCarProject.carProjectBeanService.brands}" var="i" itemLabel="#{i.value} - #{i.label}" itemValue="#{i}"/>
<p:ajax event="change" listener="#{searchCarProject.menuSelect}" update="errorGrid innerGrid " partialSubmit="true"/>
<f:converter binding="#{mlCarProjectAttributeConverter}" />
</p:selectOneMenu>
<p:calendar id="cal1" widgetVar="deDateWidget" pattern="dd.MM.yyyy" value="#{carservice.carProject.termin_de}" mindate="#{searchCarProject.currentDate}" navigator="true">
<p:ajax event="dateSelect" listener="#{searchCarProject.calSelect}"/>
</p:calendar>
</ui:repeat>
我的服务器方法:
//for selectOneMenues
public void menuSelect(final AjaxBehaviorEvent event) {
final String id = event.getComponent().getClientId();
//id = selectionForm:entryActionTabs:repeat:0:menu1 <- 0 = the right selected one
}
//for calendar
public void calSelect(final AjaxBehaviorEvent event) {
final String id = event.getComponent().getClientId();
//id = selectionForm:entryActionTabs:repeat:5:cal1 <- always 5 = always the last index
}
所以在活动结束后不会给我正确的日历值,我想我应该尝试使用 var 属性:
<p:calendar id="de_calendar" widgetVar="deDateWidget" pattern="dd.MM.yyyy" value="#{carservice.carProject.termin_de}" mindate="#{searchCarProject.currentDate}" navigator="true">
<f:ajax event="dateSelect" listener="#{searchCarProject.calSelectWithAttributes(**loop.index,carservice.carProject.name**)}"/>
</p:calendar>
但我仍然只得到最后的值,如果我对 selectOneMenu 做同样的事情,我会得到选定的值...
public void calSelectWithAttributes(final int index, final String name) {
index = always 5 = always the last index, name = obj name, is always the last one same as index
}
所以我不知道为什么 selectOneMenu 给我正确的 loop.index / 属性 / 事件,但只有日历总是最后...
编辑:甚至用 h:dataTable 尝试过,完全相同的问题...Ajaxevent returns 始终是日历的最后一个 ID。
看来日历只是有问题,尝试了很多其他 primefaces 组件,除日历外一切正常...
所以我放弃了解决该问题的常规方法。我注意到例如 onclick="jsMethod(this)" 将通过 javascript 获取 id。所以现在我调用我的 js 方法,获取 id,触发远程命令并从远程命令方法读取保存的值。这是一个丑陋的解决方法,但我想不出比这更好的方法了。
你可以在这里找到一个例子:http://blogs.bytecode.com.au/glen/2013/09/25/calling-primefaces-remotecommand-with-javascript-arguments.html
当您使用 ui:repeat
p:calendar
中的 widgetVar="deDateWidget"