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

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

Мой вид:

<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());
    }

}

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


person simonTifo    schedule 11.03.2013    source источник
comment
Попробуйте добавить атрибут process="@this" вашего <p:commandLink>. Я надеюсь, что ваш компонент входит в состав one <h:form>, верно?   -  person skuntsel    schedule 11.03.2013
comment
спасибо, это работает, да, мой компонент находится внутри формы h:   -  person simonTifo    schedule 12.03.2013
comment
Спасибо @skuntsel. Ошибка нуба, но ваш комментарий заставил меня понять, что у меня есть вложенная ‹h:form›, из-за которой remoteCommand не работает!   -  person Jacob Ensor    schedule 17.08.2013


Ответы (2)


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

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

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

person skuntsel    schedule 11.03.2013

Работает следующий код:

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

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 Мохарра 2.1.7
  • Простые лица 3.4.2
  • JBoss AS 7.1

Витрина Primefaces.

person Tapas Bose    schedule 11.03.2013