Это мой составной компонент 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 вызывать обновление method
testBean
, но он вызывает функцию alert (' it works ');
Когда я использую <p:remoteCommand>
я могу позвонить из <f:ajax onevent="myRemote">
, а затем определить
<p:remoteCommand name="myRemote" actionListener="#{testBean.update}"
update="growl"/>
Но мне не нравится это решение, и не понимаю, почему мой подход не работает.
Большое спасибо @BalusC, этот пример приведен в этой статье: http://www.ibm.com/developerworks/java/library/j-jsf2fu-0610/index.html – Anatoly
Ох. Это довольно старая статья. Вероятно, он полагается на доисторическую ошибку. Это по крайней мере не так. Я оставляю автору письмо, спасибо. – BalusC
спасибо, что он работает, и, пользуясь этой возможностью, я хотел бы поблагодарить вас за ваши неоценимые статьи и ответы здесь. – Anatoly