2013-05-05 2 views
1

У меня есть этот кусок кода, который не делает точно, что я думал. Я пытаюсь установить свойство Ajax, а затем повторно отнести один компонент. Моя .xhtml выглядит следующим образомрендеринг <h: panelGroup> by ajax в jsf

<h:form> 
     <h:commandButton value="Render!" > 
      <f:ajax render=":result" listener="#{eFindUser.findUser}" /> 
     </h:commandButton> 

    </h:form> 

    <h:panelGroup id="result" layout="block" rendered="#{eFindUser.responseRendered}" > 
     This is some text that is supposed to be rendered later 
    </h:panelGroup> 

подкладочный боб выглядит следующим образом

@Named(value = "eFindUser") 
@ViewScoped 
public class EFindUserManagedBean implements Serializable{ 
    private boolean responseRendered = false; 
    /** 
    * Creates a new instance of EFindUserManagedBean 
    */ 

    public EFindUserManagedBean() { 
    } 

    public void findUser(AjaxBehaviorEvent abe) { 
     responseRendered = !responseRendered; 
     System.out.println("finding..... ("+ responseRendered+")" + this); 
    } 
    public boolean isResponseRendered() { 
     return responseRendered; 
    } 

    public void setResponseRendered(boolean responseRendered) { 
     this.responseRendered = responseRendered; 
    }  
} 

Когда я снова нажмите на кнопку, свойство не изменяется. Существует сообщение в serverlog, который говорит

INFO: finding..... (true)[email protected] 
INFO: finding..... (true)[email protected] 

Очевидно, что существует некоторая проблема с управляемым бобом, как она создается каждый раз, когда есть запрос, даже если он должен быть видом области действия.

Что следует изменить, чтобы группа панелей (id: «result») могла изменить ее видимость? Никаких дополнительных интерфейсов или других технологий.

Большое спасибо за ваши ответы

ответ

2

Это работает для меня:

<ui:composition> 
<h:form id="mainForm"> 
     <h:commandButton value="Render!" action="#{eFindUser.findUser}"> 
      <f:ajax event="action" render=":result" /> 
     </h:commandButton> 
</h:form> 

    <h:panelGroup id="result" layout="block" rendered="#{eFindUser.responseRendered}" > 
     This is some text that is supposed to be rendered later 
    </h:panelGroup> 

</ui:composition> 

Bean:

@ManagedBean 
@ViewScoped 
public class EFindUser implements Serializable{ 
    private static final long serialVersionUID = -7106162864352727534L; 
    private boolean responseRendered = false; 

    public EFindUser() { 
    } 

    public void findUser() { 
     responseRendered = !responseRendered; 
     System.out.println("finding..... ("+ responseRendered+")" + this); 
    } 
    public boolean isResponseRendered() { 
     return responseRendered; 
    } 

    public void setResponseRendered(boolean responseRendered) { 
     this.responseRendered = responseRendered; 
    }  
} 

посмотрите на JSF 2.0 + Ajax Hello World Example

+0

не работает для меня, хотя. Может быть, потому, что я использую CDI. Да! Вот и все. У CDI нет области просмотра. В сочетании с ответом Александра Лавуа я получил его работу, спасибо. –

5

Вы не можете оказать динамически компонент JSF, который не отображается все время. Объект должен существовать на стороне клиента DOM. При использовании rendered = "false", выход не создается на стороне сервера.

Изменить код так:

<h:form> 
    <h:commandButton value="Render!" > 
     <f:ajax render=":result" listener="#{eFindUser.findUser}" /> 
    </h:commandButton> 

</h:form> 

<h:panelGroup id="result"> 
    <h:panelGroup layout="block" rendered="#{eFindUser.responseRendered}" > 
     This is some text that is supposed to be rendered later 
    </h:panelGroup> 
</h:panelGroup> 

При том, что DOM всегда будет содержать что-то с "результат" ID =.

+0

может быть, но это не решает воссоздание управляемого компонента View-scoped. Таким образом, '# {eFindUser.responseRendered}" всегда разрешено false. –

+0

Большое спасибо за решение! Как вы говорите, просто укажите, что первая 'panelGroup' всегда будет генерировать' '(void, если рендеринг свойство второй группы Panel является ложным) – troig