【问题标题】:p:calendar bugs in ui:repeat / h:dataTable, can't get selected indexp: ui:repeat / h:dataTable 中的日历错误,无法获取选定索引
【发布时间】:2015-07-16 10:42:01
【问题描述】:

我有一个 ui:repeat,其中包含一些带有 actionlistener 的输入元素,我想更改元素的样式,如果它们是由用户编辑的。

我知道通过 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 总是返回日历的最后一个 id。

【问题讨论】:

  • Jsf impl 和版本? 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 版本已经比较老了(一年多一点)。

标签: ajax jsf primefaces calendar uirepeat


【解决方案1】:

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

【讨论】:

  • 很好看。如果您将“尝试”替换为解释,答案会更好。
  • 不敢相信我没有尝试过这个,但问题是我需要其他东西的小部件:O
  • @dontcare:这是客户端。您可以在小部件 var 中内联循环索引。另见 a.o. stackoverflow.com/questions/13199595/…
【解决方案2】:

似乎日历只是被窃听了,尝试了很多其他的 primefaces 组件,除了日历之外一切都很好......

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-22
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多