Ajax p:ui:repeat/h:dataTable中的日历错误,can';无法获取选定的索引

Ajax p:ui:repeat/h:dataTable中的日历错误,can';无法获取选定的索引,ajax,jsf,primefaces,calendar,uirepeat,Ajax,Jsf,Primefaces,Calendar,Uirepeat,我得到了一个ui:使用actionlisteners重复一些输入元素,如果这些元素是由用户编辑的,我想更改它们的样式 我知道,通过ui:repeat,服务器端和客户端的组件具有不同的作用域。因此,我希望获得所选的循环索引或元素的clientID来调用javascript函数来更改样式 这对我的selectOneMenu很好,我使用ajax调用一个方法并获得正确的clientID。但是如果我在日历上尝试同样的事情,我总是会得到ui的最后一个元素/索引:repeat循环,而不是选中的一个 我的jsf

我得到了一个ui:使用actionlisteners重复一些输入元素,如果这些元素是由用户编辑的,我想更改它们的样式

我知道,通过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>
所以我不知道为什么selectOneMenu给了我正确的loop.index/attribute/event,但只有日历总是最后一个


编辑:甚至使用h:dataTable进行了尝试,显然是同一个问题……Ajaxevent始终返回日历的最后一个id。

似乎日历只是被窃听了,尝试了大量其他primefaces组件,并且都可以正常工作,只需删除日历

所以我放弃了正常的方法来解决这个问题。我没有想到,例如onclick=“jsMethod(this)”将通过javascript获得id。现在我调用我的js方法,获取id,触发remotecommand并从remotecommand方法读取保存的值。这是一个丑陋的解决办法,但我想不出比这更好的办法了


您可以在这里找到一个例子:

当您使用
ui:repeat

Jsf impl and version时,删除
p:calendar
中的
widgetVar=“deDateWidget”
?PF版本?如果不使用这些,请尝试最新版本?Jsf 2.2是api版本Mojarra或Myfaces是impls,2.2.x是版本。抱歉,忘了添加它的Myfaces和什么版本???2.2.99?在今天最新的Mojarra和PrimeFaces(Mojarra 2.2.11+PrimeFaces 5.2)中适用于我。至少尝试升级PrimeFaces。版本5.0.2已经比较老了(一年多一点)。很好的发现。如果你用一个解释来代替“try”,答案会更好。真不敢相信我没有试过这个,但问题是我需要这个小部件来做其他事情:O@dontcare:这是客户端。您可以在小部件变量中内联循环索引。
    //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    
}
<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>
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
}