2013-03-11 5 views
2

Я использую Primefaces, и у меня есть проблема, что setPropertyActionListener не запускается и, следовательно, не задает свойство управляемого компонента с видимым видом.Слушатель действия свойств не вызывается при присоединении к команде с командами Primefaces

Мое мнение:

<p:column> 
    <p:commandLink value="Supprimer" oncomplete="confirmation.show()" > 
     <f:setPropertyActionListener value="#{car}" target="#{typeMB.selectedType}" /> 
    </p:commandLink> 
</p:column> 

Управляемая боб обладает свойством selectedType, для которых есть как геттер и сеттер.

Мой управляемый компонент:

@ManagedBean(name="typeMB") 
@ViewScoped 
public class TypeManagedBean implements Serializable { 

    private static final long serialVersionUID = 1L; 
    private Type newtype; 
    private Type selectedType; 

    @ManagedProperty(value="#{TypeDao}") 
    GenericDao<Type> typeDAO; 

    public TypeManagedBean(){ 
     newtype = new Type(); 
    } 

    public List<Type> getList_types() {  
     return typeDAO.readAll(); 
    } 

    public void setTypeDAO(GenericDao<Type> typeDAO) { 
     this.typeDAO = typeDAO; 
    } 

    public GenericDao<Type> getTypeDAO() { 
     return typeDAO; 
    } 

    public Type getNewtype() { 
     return newtype; 
    } 

    public void setNewtype(Type newtype) { 
     this.newtype = newtype; 
    }  

    public Type getSelectedType() { 
     if(selectedType != null) 
     System.out.println("get : le selected type : "+selectedType.getLibelle()); 
     return selectedType; 
    } 

    public void setSelectedType(Type selectedType) {   
     this.selectedType = selectedType; 
     System.out.println("set le selected type : "+selectedType.getLibelle()); 
    } 

} 

Что я могу сделать, чтобы достичь того, чего я хочу?

+1

Попробуйте добавить 'process =" @ этот атрибут '' вашего ''. Я надеюсь, что ваш компонент включен в * one * '', правильно? – skuntsel

+0

спасибо, это работает, да, мой компонент находится внутри h: form – simonTifo

+0

Добро пожаловать! – skuntsel

ответ

3

Согласно Primefaces (3.5) user's guide, раздел на <p:commandLink> и заявление, сделанное Primefaces lead on this forum, значение по умолчанию process атрибута @all, а это означает, что вся страница будет представлен. Таким образом, из этого представления могут быть некоторые ошибки проверки, не позволяющие вызвать методы прослушивателя. В противном случае он должен работать так, как ожидалось, с кодом, который вы опубликовали.

Хорошим испытанием для вышеупомянутого предположения является установка атрибута process="@this". Поскольку «действия, связанные с выполняемой ссылкой, необходимо частично отправить ссылку», как это прекрасно объясняется BalusC в What is the function of this exactly, нам нужно добавить атрибут для выполнения теста.

Еще одна вещь, которую нужно проверить, состоит в том, что ваши компоненты команд принадлежат форме и что ваше представление не содержит вложенных форм в любом месте.

1

Следующий код работает:

Управляемый боб:

package app.so.dev.web.controller; 

import java.io.Serializable; 
import java.util.ArrayList; 
import java.util.List; 

import javax.annotation.PostConstruct; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ViewScoped; 

import app.so.dev.web.model.Student; 

@ManagedBean(name = "so15344819") 
@ViewScoped 
public class SO15344819 implements Serializable { 

    private static final long serialVersionUID = 6686378446131077581L; 
    private List<Student> students; 
    private Student selectedStudent; 

    @PostConstruct 
    public void init() { 
     students = new ArrayList<Student>(); 
     students.add(new Student("Student 1")); 
     students.add(new Student("Student 2")); 
    } 

    public List<Student> getStudents() { 
     return students; 
    } 

    public void setStudents(List<Student> students) { 
     this.students = students; 
    } 

    public Student getSelectedStudent() { 
     return selectedStudent; 
    } 

    public void setSelectedStudent(Student selectedStudent) { 
     this.selectedStudent = selectedStudent; 
    } 
} 

И XHTML:

<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" xmlns:p="http://primefaces.org/ui" template="/WEB-INF/templates/globalTemplate.xhtml"> 

    <ui:define name="title">15344819</ui:define> 
    <ui:define name="content"> 
     <p:growl id="growl" showDetail="true" /> 

     <h:form id="form"> 
      <p:dataTable id="students" value="#{so15344819.students}" var="student"> 
       <p:column> 
         <p:commandButton id="selectButton" update=":form:display" oncomplete="studentDialog.show()" icon="ui-icon-search" title="View"> 
          <f:setPropertyActionListener value="#{student}" target="#{so15344819.selectedStudent}" /> 
         </p:commandButton> 
        </p:column> 
      </p:dataTable> 

      <p:dialog header="Student Detail" widgetVar="studentDialog" resizable="false" id="studentDlg" 
          showEffect="fade" hideEffect="explode" modal="true"> 

        <h:panelGrid id="display" columns="2" cellpadding="4" style="margin:0 auto;"> 

         <h:outputText value="Name:" /> 
         <h:outputText value="#{so15344819.selectedStudent.name}" style="font-weight:bold"/>            

        </h:panelGrid> 

       </p:dialog> 
     </h:form> 
    </ui:define> 

</ui:composition> 

Окружающая среда:

  • JSF Mojarra 2.1.7
  • Primefaces 3.4.2
  • JBoss AS 7,1

Primefaces Showcase.