2015-05-14 24 views
1

內部remoteCommand我有以下情形:預處理/後處理,從p一個bean動作方法:複合

JSF與複雜的JavaScript,複合部件我想部分由JavaScript用新值從背刷新其bean(使用此複合組件的頁面的輔助bean,而不是支持組件@FacesComponent)。 我不想完全更新,因爲它是複雜的JavaScript插件,它將不可接受地打破UX

我從這裏,說明使用Primefaces的<p:remoteCommand>有回調支持組件@FacesComponent獲取值Best method for passing Data from Java/JSF2 bean to Javascript/jQuery Components

我知道這是JSF的一些弊端,但想封裝所有的功能在一個單一的單元和不與JAX-RS混淆如果你可以建議另一個很好的解決方案如何封裝這樣複雜的jQuery插件(爲了清晰起見,我們正在談論FullCalendar,我知道Primefaces有它自己的這個組件的實現,但它的功能不足以滿足我的要求,所以,我是需要做我自己的實現)與ajax回調高度相關的參數,你是高度w歡迎在這裏分享。

我的問題是如何使用JavaScript更新支持bean的後備組件@FacesComponent中的值?目前,我參與了以下事件鏈:

  1. 從Javascript <p:remoteCommand>調用與傳遞給後盾組件@FacesComponent參數要在AjaxBehaviorEvent

    的JavaScript後出動:

     refreshEvents([ 
           {name:'start', value:start.format()}, 
           {name:'end', value:end.format()} 
         ]); 
    

    JSF代碼

    var hiddenField = $(document.getElementById(variables.hiddenId)); 
        hiddenField.trigger("keypress"); 
    
  2. 在複合元件的重寫方法public void queueEvent(FacesEvent event) I:其中我通過使用

    getStateHelper().put(...); 
    
  3. jQuery的事件存儲在一個背襯部件

    <p:remoteCommand name="refreshValues" oncomplete="loadValues()" action="#{cc.refreshLocal()}" process="@this"/> 
    

    參數從複合部件由下面的JavaScript代碼分派添加到此之前存儲的此AjaxBehaviorEvent屬性中,並在第一步中向其發送。

  4. 從頁面中的「捕獲」,其中複合部件嵌套,並在此組件上執行process複合組件分派事件:

    <p:ajax event="refreshEvent" process="@this" listener="#{bean.refreshEvents}"/> 
    

    #{bean.refreshEvent}方法I至@EJB豆和負載數據進行請求。

  5. 在從步驟1再次調用回調由loadValues()

    <p:remoteCommand name="loadValues" action="#{cc.getLocalData()}" oncomplete="updateValues(xhr, status, args);"/>

  6. 在背襯組件的方法#{cc.getLocalData()}我通過使用添加回調參數:

    RequestContext.getCurrentInstance().addCallbackParam("param", ...);

  7. 功能updateValues(xhr, status, args)從步驟5得到args這個參數我的價值觀,並執行實際更新。

那麼,我的一般問題是有可能簡化這個過程,以及如何?

謝謝。

+1

看看最新的PF快照或精英版本。它具有擴展功能。如果你使用PF,爲什麼不下載源代碼,創建一個補丁並提交它? – Kukeltje

+0

有兩個問題。首先,我還沒有去,我有很多東西要學習。其次,由於我的工作政策,分享我們的代碼並不簡單,不是不可能,但不簡單。其實我只是看了源代碼。我認爲我可以通過重寫'protected void encodeEvents(FacesContext context,Schedule schedule)'來做到這一點,可能它並不像我想的那麼困難,謝謝你的支持。 – Anatoly

+0

我的意思是提示:) – Anatoly

回答

2

這確實有點過於複雜。總共有3個Ajax請求只是執行一個動作,一個支持組件通過視圖狀態向前和向後傳遞數據。

您的主要目標似乎能夠將bean操作方法聲明爲複合組件屬性,然後應由複合內的<p:remoteCommand>調用,並根據傳入的參數返回所需的模型實體,最好帶有一些pre - 和後期處理。

可以使用<cc:attribute method-signature>在複合界面來聲明的方法表達屬性:

<cc:interface componentType="yourComposite"> 
    <cc:attribute name="eventListener" method-signature="com.example.Entity method(java.lang.String, java.lang.String)" required="true" /> 
</cc:interface> 

可以在如以下的模板客戶端可以使用:

<my:composite ... eventListener="#{bean.eventListener}" /> 
public Entity eventListener(String start, String end) { 
    // ... 
    return entity; 
} 

的複合實現可能看起來像這樣:

<cc:implementation> 
    ... 
    <p:remoteCommand name="refreshEvents" 
     process="@this" action="#{cc.processEventListener}" 
     oncomplete="updateValues(xhr, status, args)" /> 
    ... 
</cc:implementation> 

#{cc.processEventListener}方法可以獲得eventListener屬性作爲MethodExpression並且如下調用它,與一些預處理和後處理沿着:

public void processEventListener() { 
    String start = getRequestParameter("start"); 
    String end = getRequestParameter("end"); 
    // ... 
    MethodExpression method = (MethodExpression) getAttributes().get("eventListener"); 
    Entity entity = (Entity) eventListener.invoke(getFacesContext().getELContext(), new Object[] { start, end }); 
    // ... 
    addCallbackParam("param", entityAsJSON); 
} 

現在,只有1個AJAX請求「如常」。

+0

但是對於這種情況,我應該在webbean中創建json,並且我想將所有這些功能(POJO - > json)封裝在後備組件中,是否可以實現並保留1個Ajax請求? – Anatoly

+0

查看更新的答案。 – BalusC

+0

非常感謝。 – Anatoly