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