2017-12-08 7 views
0

DynaForm(primefaces-extensions)コンポジットに含まれるコンポーネントから発生したイベントをリッスンしようとしています。複合親からの子コンポーネントイベントを監視する

<my:dynaForm model="#{controller.model}" controller="#{controller}"> 
    <p:ajax event="keyup" listener="#{controller.klaSelected}" /> 
</my:dynaForm> 

私の質問から、これらのイベントをキャッチする方法を、基本的には次のとおりです。このDynaFormは、そのようなdynaForm.xhtml

<ui:component 
    xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:f="http://xmlns.jcp.org/jsf/core" 
    xmlns:h="http://xmlns.jcp.org/jsf/html" 
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets" 
    xmlns:cc="http://xmlns.jcp.org/jsf/composite" 
    xmlns:pe="http://primefaces.org/ui/extensions" 
    xmlns:p="http://primefaces.org/ui"> 

    <cc:interface componentType="ccdynaForm"> 
    </cc:interface> 

    <cc:implementation> 
     <pe:dynaForm id="dynaForm" value="#{dynaFormController.model}" var="data" columnClasses="label-container, field-container"> 
      <pe:dynaFormControl type="input" for="txt"> 
       <p:inputText id="txt" value="#{data.value}" required="#{data.required}"> 
        <p:ajax event="keyup" /> 
       </p:inputText> 
      </pe:dynaFormControl> 
     </pe:dynaForm> 
    </cc:implementation> 
</ui:component> 

そして、私はこれを行うことができるようにしたいと思い終わり、のような複合に含まれています複合dynaForm)? keyUpイベントが発射されると、CCDynaFormのqueueEventメソッドが呼び出されますが、リスナーがないです...ここで

答えて

0

が最初のソリューションである、listenerコールバックが呼び出されるが、このようなprocessとしてクライアントコールバックされ、updateまたはoncompleteではありません(私は」 mは依然として)溶液を検索:

@Override 
public void queueEvent(FacesEvent event) { 
    super.queueEvent(event); 

    Map<String, List<ClientBehavior>> behaviors = getClientBehaviors(); 
    if (behaviors.isEmpty() || !(((EventDataWrapper)event).getFacesEvent() instanceof AjaxBehaviorEvent)) { 
     return; 
    } 

    FacesContext context = getFacesContext(); 
    Map<String, String> params = context.getExternalContext().getRequestParameterMap(); 
    String behaviorEvent = params.get("javax.faces.behavior.event"); 

    if (null != behaviorEvent) { 
     List<ClientBehavior> behaviorsForEvent = behaviors.get(behaviorEvent); 

     if (!behaviorsForEvent.isEmpty()) { 
      String behaviorSource = params.get("javax.faces.source"); 

      if (behaviorSource != null) { 
       for (ClientBehavior behavior : behaviorsForEvent) { 
        AjaxBehaviorEvent ev = new AjaxBehaviorEvent(event.getComponent(), behavior); 
        ev.setPhaseId(event.getPhaseId()); 
        super.queueEvent(ev); 
       } 
      } 
     } 
    } 
} 

decode方法をオーバーライドする必要がありません。私はこの時点でこれらのクライアントの動作をエンコードすることができるはずですが、それを実行するのに最適な場所であることを確信していない(通常はencodeEndメソッドで行われます)または正しく行う方法...

関連する問題