2015-07-08 5 views
1

Я пытаюсь обновить значение, которое находится внутри h: dataTable из Bootstrap Modal, используя чистый JSF 2.2 с CDI.Jsf 2.2 h: commandButton не работает внутри bootstrap modal

Вот DataTable:

<h:dataTable id="tabNotas" value="#{notaBean.notas}" var="nota" 
         styleClass="table table-hover"> 
         <h:column> 
          <f:facet name="header"> 
           <h:outputText value="ALUNO" /> 
          </f:facet> 
          <h:outputText value="#{nota.aluno.nome}" /> 
         </h:column> 
         <h:column> 
          <f:facet name="header"> 
           <h:outputText value="Disciplina" /> 
          </f:facet> 
          <h:outputText value="#{nota.disciplina.nome}" /> 
         </h:column> 
         <h:column> 
          <f:facet name="header"> 
           <h:outputText value="TIPO" /> 
          </f:facet> 
          <h:outputText value="#{nota.tipo.descricao}" /> 
         </h:column> 
         <h:column> 
          <f:facet name="header"> 
           <h:outputText value="NOTA" /> 
          </f:facet> 
          <h:outputText value="#{nota.valor}" /> 
         </h:column> 
         <h:column> 

          <h:commandLink class="btn btn-primary" value="Alterar"> 
           <f:passThroughAttribute name="data-toggle" value="modal" /> 
           <f:passThroughAttribute name="data-target" value="#myModal" /> 
           <f:ajax listener="#{notaBean.editarNota(nota)}" 
            render="formModalNotas" /> 
          </h:commandLink> 
         </h:column> 
        </h:dataTable> 

А вот модальный:

<div id="myModal" class="modal fade"> 
       <h:form id="formModalNotas" role="form"> 
        <div class="modal-dialog"> 
         <div class="modal-content"> 
          <h:messages showSummary="true" errorClass="alert alert-danger" 
           infoClass="alert alert-success" for="formModalNotas" /> 
          <input type="hidden" name="id" value="#{notaBean.nota.aluno.id}" /> 
          <div class="modal-header"> 
           <button type="button" class="close" data-dismiss="modal" 
            aria-hidden="true"></button> 
           <h4 class="modal-title">Alterar</h4> 
          </div> 
          <div class="modal-body"> 
           <div class="form-group "> 
            <label for="tipoNota">Tipo da Nota:</label> 
            <h:inputText value="#{notaBean.nota.tipo.descricao}" 
             styleClass="form-control" id="tipoNota" disabled="true" /> 
           </div> 
           <div class="form-group "> 
            <label for="nota">Nota:</label> 
            <h:inputText value="#{notaBean.nota.valor}" 
             styleClass="form-control" id="nota" /> 
           </div> 
          </div> 
          <div class="modal-footer"> 
           <button type="button" class="btn btn-default" 
            data-dismiss="modal">Close</button> 
           <h:commandButton value="Salvar" action="#{notaBean.alterar}" 
            styleClass="btn btn-primary"> 
           </h:commandButton> 
          </div> 
         </div> 
        </div> 
       </h:form> 
      </div> 

модальное работает отлично, проблема заключается в действии = "# {} notaBean.alterar" который никогда не называется.

Я что-то не так? Кто-нибудь делал это раньше?

EDIT

Я использую Tomcat 8. Вот код NotaBean, я изменил к ViewScoped еще ничего =/

@Named(value = "notaBean") 
@ViewScoped 
public class NotaBean implements Serializable { 

private static final long serialVersionUID = 5134990385063835570L; 

@Inject 
private NotaDao notaDao; 

@Inject 
private Dao<Curso> daoCurso; 

@Inject 
private Dao<Disciplina> disciplinaDao; 

@Inject 
private Nota nota; 

private Aluno aluno; 

private List<Disciplina> disciplinas; 

@PostConstruct 
public void init() { 
    nota.setDisciplina(new Disciplina()); 
} 

public Nota getNota() { 
    return nota; 
} 

public void setNota(Nota nota) { 
    this.nota = nota; 
} 

public Aluno getAluno() { 
    return aluno; 
} 

public void setAluno(Aluno aluno) { 
    this.aluno = aluno; 
} 

public List<Disciplina> getDisciplinas() { 
    if (aluno == null || aluno.getCurso().getId() == null) { 
     disciplinas = null; 
    } else { 
     Curso cursoSelecionado = daoCurso.buscaPorId(aluno.getCurso() 
       .getId()); 
     disciplinas = cursoSelecionado.getDisciplinas(); 
    } 

    return disciplinas; 
} 

public void setDisciplinas(List<Disciplina> disciplinas) { 
    this.disciplinas = disciplinas; 
} 

@Transacional 
public void cadastrar() { 
    try { 
     nota.setAluno(aluno); 
     nota.setDisciplina(disciplinaDao.buscaPorId(nota.getDisciplina() 
       .getId())); 
     validar(nota); 
     notaDao.adiciona(nota); 
     FacesContext facesContext = FacesContext.getCurrentInstance(); 
     FacesMessage facesMessage = new FacesMessage(
       "Nota cadastrada com sucesso!"); 
     facesMessage.setSeverity(FacesMessage.SEVERITY_INFO); 
     facesContext.addMessage(null, facesMessage); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     FacesContext facesContext = FacesContext.getCurrentInstance(); 
     FacesMessage facesMessage = new FacesMessage(e.getMessage()); 
     facesMessage.setSeverity(FacesMessage.SEVERITY_ERROR); 
     facesContext.addMessage(null, facesMessage); 
    } 
} 

private void validar(Nota nota) throws Exception { 
    if (nota.getValor() == null) { 
     throw new Exception("Valor da nota � obrigat�rio"); 
    } 

    if (nota.getValor() < 0 || nota.getValor() > 10) { 
     throw new Exception("Valor da nota deve ser entre 0 e 10"); 
    } 

    for (Nota notaAluno : aluno.getNotas()) { 
     if (notaAluno.getDisciplina().equals(nota.getDisciplina())) { 
      if (notaAluno.getTipo().equals(nota.getTipo())) { 
       throw new Exception("Nota de " + nota.getTipo() 
         + " para a disciplina " + notaAluno.getDisciplina() 
         + " j� cadastrada"); 
      } 
     } 
    } 
} 

public List<TipoNota> getTiposNota() { 
    return Arrays.asList(TipoNota.values()); 
} 

public List<Nota> getNotas() { 
    return notaDao.buscarNotasAluno(aluno.getId()); 
} 

public void editarNota(Nota nota) { 
    this.nota = nota; 
} 

@Transacional 
public void alterar() { 
    try { 
     validar(nota); 
     notaDao.atualiza(nota); 
     FacesContext facesContext = FacesContext.getCurrentInstance(); 
     FacesMessage facesMessage = new FacesMessage(
       "Nota alterada com sucesso!"); 
     facesMessage.setSeverity(FacesMessage.SEVERITY_INFO); 
     facesContext.addMessage(null, facesMessage); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     FacesContext facesContext = FacesContext.getCurrentInstance(); 
     FacesMessage facesMessage = new FacesMessage(e.getMessage()); 
     facesMessage.setSeverity(FacesMessage.SEVERITY_ERROR); 
     facesContext.addMessage(null, facesMessage); 
    } 
} 
} 
+0

Вы могли бы дать свой сервер и версию и исходный код 'NotaBean'? –

+0

Проверьте, что на стороне cliend форма html находится в диалоговом окне (или, по крайней мере, это то, что становится диалогом), если оно полностью отображается ... – Kukeltje

+0

@ AntoineSabot-Durand Я отредактировал вопрос с источником NotaBean , Я использую Tomcat 8 –

ответ

0

Проблема будет решена, если вы поставите <h:form></h:form> из стороны модальный как: ​

<h:form> 
.... modal..... 
</h:form> 

как на меня внутри модального кнопка команды сё uld использовать с <f:ajax></f:ajax>, иначе он перезагрузит страницу.

+0

??? Я не понимаю, почему это поможет. И да, абсурд «f: ajax» делает это, но это не связанная с этим проблема. – Kukeltje

+0

Это сработало для меня, я думаю, сохраняя форму на стороне, модальная форма будет отображаться в html (если u сохранит ее внутри, может не визуализировать и конфликтовать с вашими другими формами или работать, если я сохраняю форму внутри модального контента), так что h: commandButton работал. –

+0

У вас случайно была вложенная форма? – Kukeltje