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

时间:2015-07-16 10:42:01

标签: ajax jsf primefaces calendar uirepeat

我有一个ui:使用actionlisteners重复一些输入元素,我想改变元素的样式,如果它们是由用户编辑的。

我意识到通过ui:重复我们对服务器和客户端的组件有不同的范围。因此,我想获取选定的循环索引或元素的clientID来调用javascript函数来更改样式。

这适用于例如我的selectOneMenu,我用ajax调用方法并获得正确的clientID。但是,如果我用我的日历尝试相同的东西,我总是得到ui的最后一个元素/索引:重复循环而不是所选择的...

我的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 / attribute / event但只有日历总是最后一个......

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

2 个答案:

答案 0 :(得分:2)

使用>>> print(re.findall("\"(release/.+?)\"", text)) >>> ['release/testing', 'release/xzczx', 'release/a.aa.a.2', 'release/1a1', 'release/aaaa', 'release/another_release', 'release/asdasdasd', 'release/my_branch', 'release/please_work', 'release/qqqqq', 'release/test_branch', 'release/zzzasdasda', 'release/zzzsersfawda'] 时删除widgetVar="deDateWidget"中的p:calendar

答案 1 :(得分:0)

似乎日历只是被窃听,尝试了大量的其他主要组件,所有工作都很好地解除了日历......

所以我放弃了解决这个问题的正常方法。我引用了例如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