p:ui:repeat/h:dataTable中的日历错误,无法获取所选索引



我得到了一个ui:重复与几个输入元素与actionlisteners,我想改变元素的风格,如果他们是由用户编辑。

我知道通过ui:repeat,我们对服务器端和客户端组件有不同的作用域。因此,我想获得选定的循环索引或元素的clientID来调用javascript函数来更改样式。

这工作得很好,例如我的selectOneMenu,我用ajax调用一个方法,并获得正确的客户端编号。但是如果我对日历做同样的事情,我总是得到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>
我server-methods

:

    //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给我正确的循环。索引/属性/事件,但只有日历总是最后一个…

编辑:甚至尝试了h:dataTable,完全相同的问题…Ajaxevent总是返回日历的最后一个id。

在使用ui:repeat时删除p:calendar中的widgetVar="deDateWidget"

似乎日历只是有bug,尝试了大量其他primefaces组件,除了日历之外都工作得很好…

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

你可以在这里找到一个例子:http://blogs.bytecode.com.au/glen/2013/09/25/calling-primefaces-remotecommand-with-javascript-arguments.html

相关内容

  • 没有找到相关文章

最新更新