p:commandLink actionListener обрабатывается для каждой строки p:dataTable при рендеринге страницы.

У меня есть таблица данных, которая показывает данные, хранящиеся в базе данных. Один из столбцов содержит commandLink (p: commandLink) для редактирования выбранной строки, что нормально.

У меня проблема во время рендеринга моей страницы xhtml. Кажется, что метод backingBean в атрибуте actionListener commandLink обрабатывается для каждой строки в таблице, но actionListener должен обрабатываться только при нажатии на ссылку.

Вот моя страница xhtml (часть):

<h:form id="formElenco">
    <p:dataTable id="dt1" value="#{myBean.itemList}" var="item">
        <f:facet name="header">
            <h:outputText value="header" />
        </f:facet>
        <p:column>
            <f:facet name="header">
                <h:outputText value="Name" />
            </f:facet>
            <h:outputText value="#{item.name}"/>
        </p:column>
        <p:column>
            <f:facet name="header">
                <h:outputText value="value" />
            </f:facet>
            <h:outputText value="#{item.value}"/>
        </p:column>
        <p:column>
            <p:commandLink id="lnkItemUpdate" value="Edit"
                            onstart="document.getElementById('divUpdateItem').style.display = 'block';"
                            actionListener="#{myBean.updateItemAction(item)}" update=":formUpdateItem" />
        </p:column>

    </p:dataTable>
</h:form>

<div id="divUpdateItem" style="display:none" > 
    <h:form id="formUpdateItem">
        Nome <h:inputText value="#{myBean.name}" /><br/>
        Met  <h:inputText value="#{myBean.value}" /><br/>
        <h:inputHidden value="#{myBean.id}" />
        <h:commandButton action="#{myBean.updateItemAction}" value="Save" />
    </h:form>
</div>

Вот метод myBean (myBean имеет requestScoped):

public String updateItemAction(Entity item){
    this.setId(item.getId());
    this.setName(item.getName());
    this.setValue(item.getValue());
    return null;
}

public String updateItemAction() {
    Entity entity = new Entity();
    entity.setId(this.getId());
    entity.setName(this.getName());
    entity.setVAlue(this.getValue());
    updateEntityQueryMethod(entity);
    return null;
}

person giupa    schedule 02.02.2012    source источник


Ответы (1)


Это недопустимая сигнатура метода для actionListener, поэтому <p:commandLink> обрабатывается как выражение значения.

Вместо этого вы должны использовать action.

<p:commandLink id="lnkItemUpdate" value="Edit"
    onstart="document.getElementById('divUpdateItem').style.display = 'block';"
    action="#{myBean.updateItemAction(item)}" update=":formUpdateItem" />

Обратите внимание, что вы также можете просто вернуть void вместо null String.

public void updateItemAction(Entity item) {
    this.setId(item.getId());
    this.setName(item.getName());
    this.setValue(item.getValue());
}

Допустимой сигнатурой метода actionListener будет метод void, принимающий javax.faces.event.ActionEvent аргумент:

public void actionListener(ActionEvent event) {
    // ...
}

Смотрите также:

person BalusC    schedule 02.02.2012