我的目标:我想添加一些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:"j_idt88:j_idt94",p:"j_idt88:j_idt94"});
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:"j_idt88:j_idt94",p:"j_idt88:j_idt94"});
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);
}
我仍然只是想知道初始方法有什么问题。
答案 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:commandButton
和f: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或会话范围。传递之前打印参数。