2015-07-01 2 views
0

У меня есть страница jsf, которая состоит из 2 частей: таблица, отображающая список записей и диалоговое окно для добавления новой записи. Я добавил некоторые функции проверки, но я не могу заставить их работать правильно. мне это нужно, чтобы:Разговорное значениеScope не обновляется после начала разговора

1) Ошибка проверки не появится первый диалог показывает время до

2) Если какая-либо ошибка проверки происходит, держать его открытым и показывать сообщения об ошибках.

3) Если ошибка проверки и исходный код не выполнены успешно, обновите таблицу.

Это то, что у меня есть:

<h:body> 
<h:form id="form01"> 
    <p:dataTable id="tbl1" value="#{welcomeController.teams}" var="team" > 
     <p:column headerText="Id"> 
      <h:outputText value="#{team.seq}" /> 
     </p:column> 
     <p:column headerText="Name"> 
      <h:outputText value="#{team.name}" /> 
     </p:column> 
    </p:dataTable> 

    <p:dialog id="teamDialog" closable="false" visible="#{welcomeController.addMode}" 
      widgetVar="teamDialog_w" modal="true" resizable="false" draggable="true" 
      header="New Team Detail"> 
     <p:messages /> 
     <p:panelGrid columns="2"> 
      <h:outputText value="Name" /> 
      <p:inputText id="name" value="#{welcomeController.newTeam.name}" /> 
     </p:panelGrid> 
     <p:commandButton value="Submit" ajax="true" actionListener="#{welcomeController.addNewTeam}" 
      update=":form01"oncomplete="teamDialog_w.hide(); console.log(args);" /> 
    </p:dialog> 

    <p:commandButton value="ADD" actionListener="#{welcomeController.startAdd}" 
      oncomplete="teamDialog_w.show(); console.log(args);" update="teamDialog" /> 

</h:form> 

боб:

@Named 
@ConversationScoped 
public class WelcomeController implements Serializable { 
    private final Logger logger = LoggerFactory.getLogger(this.getClass()); 
    private static final long serialVersionUID = 1L; 

    private List<TeamDto> teams; 

    @Inject SessionManager sessionMan; 
    @Inject DatabaseUtil dbCache; 
    @Inject TeamService teamService; 
    @Inject Conversation conversation; 

    private TeamDto newTeam = new TeamDto(); 

    private boolean addMode = false; 

    public List<TeamDto> getTeams() throws IOException { 
     if (teams == null || teams.size() == 0) { 
      teams = teamService.getAll(); 
     } 
     return teams; 
    } 

    public void setTeams(List<TeamDto> teams) { 
     this.teams = teams; 
    } 

    public void reload() { 
     conversationBegin(); 
    } 

    public void conversationBegin() { 
     if (conversation.isTransient()) { 
      conversation.begin(); 
     } 
    } 

    public void conversationEnd() { 
     if(!conversation.isTransient()){ 
      conversation.end(); 
     } 
    } 

    public void startAdd() { 
     reload(); 
     newTeam = new TeamDto(); 
     addMode = true; 
    } 

    public TeamDto getNewTeam() { 
     return newTeam; 
    } 

    public void setNewTeam(TeamDto newTeam) { 
     this.newTeam = newTeam; 
    } 

    public void addNewTeam() throws IOException, ValidatorException { 
     if (newTeam.getName().isEmpty()) { 
      sessionMan.addGlobalMessageFatal("INVALID INFO", null); 
      return; 
     } 
     teamService.addTeam(newTeam); 
     teams.add(newTeam); 
     newTeam = new TeamDto(); 
     addMode = false; 
    } 

    public boolean isAddMode() { 
     return addMode; 
    } 

    public void setAddMode(boolean addMode) { 
     this.addMode = addMode; 
    } 
} 

У меня есть 2 проблемы здесь:

1) После того, как я подам пустую строку, Я ожидаю, что диалог все еще откроется (потому что addMode - это правда), но это не так. Почему это?

2) Если я ставлю на кнопку «Добавить», как это:

<p:commandButton value="ADD" actionListener="#{welcomeController.startAdd}" oncomplete="teamDialog_w.show(); console.log(args);" > 
    <f:ajax render="teamDialog" /> 
</p:commandButton> 

по крайней мере, когда я снова открыть диалог, я могу увидеть сообщение об ошибке. Но в моем коде я не вижу сообщение об ошибке. Почему это так? Разве они не эквивалентны?

Есть ли что-то не так с моим пониманием?

Пожалуйста, помогите. Большое спасибо.

ответ

0

Диалоги должны работать со своей формой в JSF, это очень важно.

Чтобы предотвратить ваш диалог с закрытием на проверки вы можете использовать в Primefaces:

if (args &amp;&amp; !args.validationFailed){PF('eventDialog').hide();}

так:

<p:commandButton value="ADD" 
      actionListener="#{welcomeController.startAdd()}" 
      oncomplete="if (args &amp;&amp; !args.validationFailed){PF('teamDialog').hide();}" 
      update="your_dialog_formID:messages, other_updated_IDs" /> 

здесь if (args &amp;&amp; !args.validationFailed){PF('teamDialog').hide();} вы можете obvoiusly добавить еще и делать # 3 "Если ошибка проверки и back-end execu ted успешно, обновите таблицу. "

здесь BalusC дает большое объяснение, почему: Keep p:dialog open when a validation error occurs after submit

Смежные вопросы