2014-12-29 5 views
2

Это мой составной компонент hc:rangeChooser:Не удается вызвать метод слушателя от F: Ajax внутри составного компонента

<ui:component xmlns="http://www.w3.org/1999/xhtml" 
       xmlns:f="http://java.sun.com/jsf/core" 
       xmlns:h="http://java.sun.com/jsf/html" 
       xmlns:ui="http://java.sun.com/jsf/facelets" 
       xmlns:cc="http://java.sun.com/jsf/composite" 
       xmlns:p="http://primefaces.org/ui"> 
    <cc:interface componentType="rangeChooser"> 
     <cc:clientBehavior name="rangeSelected" event="change" targets="#{cc.clientId}:datetype"/> 
    </cc:interface> 

    <cc:implementation> 

     <div id="#{cc.clientId}"> 
      <h:outputScript library="primefaces" name="jquery/jquery.js" target="head" /> 
      <h:outputScript library="primefaces" name="jquery/jquery-plugins.js" target="head" /> 
      <h:outputScript library="javascript" name="rangeChooser.js" /> 
      <h:outputStylesheet library="primefaces" name="primefaces.css" target="head" /> 
      <h:outputStylesheet library="primefaces" name="jquery/ui/jquery-ui.css" target="head"/> 

      <script type="text/javascript"> 
       var variables = {}; 
       variables.formid = '#{cc.clientId}'; 
      </script> 

      <h:selectOneMenu id="datetype" value="#{cc.attrs.selectedRange}" onchange="dateFunc();"> 
       <f:selectItems value="#{cc.attrs.ranges}"></f:selectItems> 
      </h:selectOneMenu> 

      .... 

      <p:inputText id="hiddenValue" value="#{cc.attrs.range}"/> 
     </div> 
    </cc:implementation> 
</ui:component> 

Когда я выбираю что-то в <h:selectOneMenu> я бегу dateFunc(); который проходят выбранное значение от него <h:inputText>, в будущем это будет быть скрытым.

Теперь это способ, как я использую этот компонент:

<h:form id="form"> 
    <p:growl id="growl"></p:growl> 
    <hc:rangeChooser1> 
     <f:ajax event="rangeSelected" 
       onevent="alert('It works');" 
       listener="#{testBean.update}" 
       update=":form:growl"/> 
    </hc:rangeChooser1> 
</h:form> 

И, наконец, метод моего бэк-бина:

public void update(AjaxBehaviorEvent e){ 
    SimpleDateFormat df = new SimpleDateFormat("dd MMM yyyy"); 
    text = df.format(from.getTime()) + " " + df.format(to.getTime()); 
    FacesContext context = FacesContext.getCurrentInstance(); 

    context.addMessage(null, new FacesMessage("Successful" + text, "Your message: " + text)); 
    context.addMessage(null, new FacesMessage("Second Message", "Additional Message Detail")); 
} 

Когда я изменить выбор все работает нормально, за исключением того, что <f:ajax> Безразлично 't вызывать обновление methodtestBean, но он вызывает функцию alert (' it works ');

Когда я использую <p:remoteCommand> я могу позвонить из <f:ajax onevent="myRemote">, а затем определить

<p:remoteCommand name="myRemote" actionListener="#{testBean.update}" 
       update="growl"/> 

Но мне не нравится это решение, и не понимаю, почему мой подход не работает.

ответ

3

Во-первых,

<cc:clientBehavior ... targets="#{cc.clientId}:datetype" /> 

Значение атрибута targets неправильно. Он интерпретируется относительно <cc:implementation>, однако #{cc.clientId} неправильно рассчитывает, что он будет интерпретироваться относительно его родителя NamingContainer. Избавьтесь от префикса #{cc.clientId}:.

<cc:clientBehavior ... targets="datetype" /> 

Не забудьте сообщить об этом автору источника, где находилась эта дезинформация. Это не первый раз, когда я вижу, как стартеры используют это, поэтому в Интернете должен быть источник, который распространяет эту дезинформацию и должен быть проинформирован.

Во-вторых,

<f:ajax ... update=":form:growl" /> 

Атрибут update не поддерживается на <f:ajax>. Это особенность PrimeFaces. Вероятно, вы хотели использовать render.

<f:ajax ... render=":form:growl" /> 

Unrelated к конкретной проблеме: <f:ajax onevent="alert('It works');"> может донельзя работать как эта конструкция не поддерживается. Значение атрибута onevent должно представлять собой имя ссылки на функцию, а не вызов функции. Таким образом, либо это неправильное наблюдение, либо вы слишком упрощенно/предполагаете слишком много, даже не проверяя его.

+0

Большое спасибо @BalusC, этот пример приведен в этой статье: http://www.ibm.com/developerworks/java/library/j-jsf2fu-0610/index.html – Anatoly

+0

Ох. Это довольно старая статья. Вероятно, он полагается на доисторическую ошибку. Это по крайней мере не так. Я оставляю автору письмо, спасибо. – BalusC

+1

спасибо, что он работает, и, пользуясь этой возможностью, я хотел бы поблагодарить вас за ваши неоценимые статьи и ответы здесь. – Anatoly