2017-01-14 11 views
1

내 목표 : 나는 commandLink를 PrimeFaces의 자식으로 추가하려고합니다. p:timeline 사용자는 해당 링크 중 하나를 클릭 할 수 있어야합니다. 클릭은 내 bean (CDI, ViewScoped)에서 메소드를 호출해야한다. 액션 메소드에서 타임 라인의 클릭 된 항목에 대한 정보가 필요합니다. 액션 메소드의 결과에 따라 다른 UI로 탐색 할 수 있습니다.p : timeline의 자식에서 전달 된 매개 변수는 액션 메소드에서 null입니다.

내 시도 : 전체 양식은 매우 짧고 간단합니다. 그래서 나는 더 나은 완전히 게시 : 하나는 XHTML에서 볼 수 있듯이, 내가 타임 라인 항목에 대한 몇 가지 "ID"를 표시하고 :

<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> 

현재 행동. 이 ID는 UI에 올바르게 표시됩니다. 조치 메소드가 실행되지만 전달 된 매개 변수는 서버 측에서 null으로 해석됩니다.

데이터 테이블 내부에서 동일한 시도 (동일한 UI, 다른 양식)를 사용하고 있습니다. 정상적으로 작동합니다. 나는 내부에서 이것과 같은 매개 변수로 액션 메소드를 호출 할 수 없다. p:timeline

내 페이지에는 중첩 된 양식이 없으며 브라우저 콘솔에는 JavaScript 오류가 없다. 나는 commandLink/button과 action/listener의 모든 조합을 시도했다. 비록 예제에서 사용 된 것이 excatly 내가 원하는 것이지만, 같은 결과를 얻었지만.

내가 PF 6.0 인 Mojarra를 사용하고 2.2.10

업데이트 : 나는 CommandLink는, 예를 들어 이런 종류를 사용하고 때 생성 된 HTML로 생성 된 HTML의 일부 slighty를 차이를 발견 데이터 테이블에서. p:timeline 매우 동일한 식별자와 자바 스크립트 호출에서

모든 단일 타임 라인 항목에 대해 생성됩니다

<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> 

나는 additio 원래의 메소드에 위임 한 backing 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); 
} 

아직도 나는 inital 접근법에있어 잘못된 점을 알고 있습니다.

답변

1

은 왜

<p:ajax event="select" listener="#{facilitatorCockpit.onSelect}"/>를 사용하지 않는?

onSelect-method에 openStatusSheet 또는 refactore openStatusSheet를 호출하여 TimelineSelectEvent을 호출 할 수 있습니다. id는 데이터 속성에 저장할 수 있습니다.

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

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

편집 : 사용자 정의 구성 요소가 f:paramp:commandButton를 사용하여 두 번째 솔루션

의 경우는 ID를 제출합니다.

<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> 

그리고 당신의 백업 콩에

당신은

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

    ... 
} 

같은 PARAM 그래서 당신이 2 개 이상 commmandButtons을 삽입 할 수 있습니다 잡을 수 있습니다.

+0

tyvm. 현재 상황에 대한 타협이 될 수 있습니다. 그러나 몇 가지 문제가 있습니다. 요점은 단일 타임 라인 이벤트에 둘 이상의 명령 링크가 추가되어야하는 UI의 변경을 기대한다는 것입니다. 타임 라인의 select 이벤트를 사용하면이 옵션이 사라집니다. – stg

+1

맞습니다. 이 사용 사례에 대한 두 번째 솔루션을 추가했습니다. – jklee

+0

f : param으로 매개 변수를 전달하면 트릭을 수행했습니다! 그래도 내 질문에 초기 접근 방식으로 작동하지 않는 이유는 모르겠다. – stg

0

timelineitem.roadmapId가 null 인 것을 의미하며, 관리 Bean ViewScope 또는 Session Scope도 작성합니다. 패스하기 전에 인쇄 매개 변수.

+0

빈 *은 * ViewScoped입니다. UI에서 올바른 ID가 타임 라인 항목의 레이블로 표시됩니다. 귀하의 답변에 – stg