从p:timeline的子项传递的参数在操作方法

时间:2017-01-14 16:16:42

标签: jsf primefaces jsf-2 jsf-2.2

我的目标:我想添加一些commandLink作为PrimeFaces的孩子p:timeline用户应该可以点击其中一个链接。点击将调用我的bean中的方法(CDI,ViewScoped)。在动作方法中,我需要来自时间轴中被点击项目的信息。根据操作方法的结果,可能会导航到不同的UI。

我的尝试: 完整的表格非常简短。所以我最好完全发布它:

<h:form>
  <p:fieldset legend="Upcoming Gates">
    <p:timeline height="200px" style="width: 99%;"
           start="#{facilitatorCockpit.timelineStart}"
           end="#{facilitatorCockpit.timelineEnd}"
           value="#{facilitatorCockpit.timelineModel}"
           var="timelineitem"
           selectable="false"
           zoomable="false"
           moveable="false"                                
           >     
       <h:outputText value="#{timelineitem.systemElement}"/> <br/>
       <p:commandLink action="#{facilitatorCockpit.openStatusSheet(timelineitem.roadmapId)}"
                               process="@this"  value="#{timelineitem.roadmapId}"
                               title="Open Status Sheet"/>         
    </p:timeline>
  </p:fieldset>
</h:form>

当前行为: 正如人们在xhtml中看到的那样,我在时间轴项目上显示了一些“Id”。此ID在UI中正确显示。执行action方法,但传递的参数在服务器端解析为null

我在数据表中使用相同的尝试(相同的UI,只是一个不同的形式),它可以正常工作。我只是无法从p:timeline

内部调用带有这样的参数的动作方法

我的网页上没有嵌套表单,浏览器控制台中没有JavaScript错误。我也试过了commandLink / button和action / listener的所有组合,即使示例中使用的那个组合是我想要的,但结果相同。

我正在使用PF 6.0和Mojarra 2.2.10

更新:当我使用这种commandLink时,我注意到生成的HTML与生成的HTML略有不同在数据表中。

p:timeline中,为每个时间轴项目生成相同的标识符和JavaScript调用:

<a id="j_idt88:j_idt94" href="#" class="ui-commandlink ui-widget" 
   aria-label="Open Status Sheet" 
   onclick="PrimeFaces.ab({s:&quot;j_idt88:j_idt94&quot;,p:&quot;j_idt88:j_idt94&quot;});
            return false;" 
   title="Open Status Sheet">FPR 137
</a>
<!-- .... -->
<a id="j_idt88:j_idt94" href="#" class="ui-commandlink ui-widget"
    aria-label="Open Status Sheet" 
    onclick="PrimeFaces.ab({s:&quot;j_idt88:j_idt94&quot;,p:&quot;j_idt88:j_idt94&quot;});
           return false;"
    title="Open Status Sheet">FPR 138

当前解决方案: 基于接受的答案,我现在的方法现在看起来像这样:

<p:commandLink action="#{facilitatorCockpit.openStatusSheetFromTimeline()}"
    process="@this"
    value="#{timelineitem.phase.label}"
    title="Open Status Sheet"
>         
   <f:param name="id" value="#{timelineitem.roadmapId}" />
</p:commandLink>

我向辅助bean添加了一个额外的操作方法,该方法委托给原始方法。

public String openStatusSheetFromTimeline() {
    Map<String, String> params = FacesContext.getCurrentInstance()
        .getExternalContext()
        .getRequestParameterMap();
    String roadmapId = params.get("id");
    Long id = Long.parseLong(roadmapId);
    return openStatusSheet(id);
}

我仍然只是想知道初始方法有什么问题。

2 个答案:

答案 0 :(得分:1)

为什么不使用

<p:ajax event="select" listener="#{facilitatorCockpit.onSelect}"/>

在onSelect-method中,您可以为TimelineSelectEvent调用openStatusSheet或重构openStatusSheet。 id可以保存在data-attribute中。

public void onSelect(TimelineSelectEvent e) {  
    TimelineEvent timelineEvent = e.getTimelineEvent();  

    // get your Id
    String roadmapId = timelineEvent.getDate.toString();
} 

修改:第二个解决方案

要提交带有自定义组件的ID,请使用p:commandButtonf:param

    <p:timeline id="timeline" value="#{timelineBean.model}"
        height="250px" selectable="true" var="item">

        <p:commandButton value="Click #{item}"
            actionListener="#{timelineBean.click()}">
            <f:param name="id" value="#{item}" />
        </p:commandButton>
    </p:timeline>

你可以在你的支持bean中找到像

这样的参数
public void click() {
    Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
    String roadmapId = params.get("id");

    ...
}

所以你可以插入2个或更多的commmandButtons。

答案 1 :(得分:0)

它表示您的timelineitem.roadmapId为null,也是您的托管bean ViewScope或会话范围。传递之前打印参数。