Как я могу перейти на другую страницу, когда пользователь щелкает строку? - PullRequest
0 голосов
/ 05 октября 2011

Я хочу иметь возможность переходить на другую страницу, когда пользователь щелкает строку.
Проблемы

  • Нет ошибокЯ вижу, что selectionListener выполняется с ожидаемым значением строки, но ничего не происходит.
  • Это правильный способ сделать это, т.е. использовать для этого мой слушатель действия.

Поддерживающий боб - это. Бэк-бин

package com.howto;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.event.AjaxBehaviorEvent;
import javax.faces.model.DataModel;

import org.richfaces.component.UIExtendedDataTable;

@ManagedBean(name = "backingBean")
@SessionScoped
public class BackingBean {
    private List<String> names;
    private DataModel<String> name;
    private String rowValue;
   // private List<String> selection;
    private Collection<String> selection;

    @PostConstruct
    public void init() {
        names = new ArrayList<String>();
        names.add("MyName");
        names.add("YourName");
        names.add("OurName");
        names.add("MamaDidNotGiveOne");
    }

    public void update() {
        System.out.println("Somebody clicked "
                + name);
    }

    public List<String> getNames() {
        return names;
    }

    public void setNames(List<String> names) {
        this.names = names;
    }

    public DataModel<String> getName() {
        return name;
    }

    public void setName(DataModel<String> name) {
        this.name = name;
    }

    public String selectionListener(AjaxBehaviorEvent event) {
        UIExtendedDataTable dataTable = (UIExtendedDataTable) event.getComponent();
        Object originalKey = dataTable.getRowKey();
      //  selectionItems.clear();
        for (Object selectionKey : selection) {
            dataTable.setRowKey(selectionKey);
            if (dataTable.isRowAvailable()) {
                //selectionItems.add((InventoryItem) dataTable.getRowData());
                rowValue =  (String) dataTable.getRowData();
            }
        }        
        dataTable.setRowKey(originalKey);
        return "success";
    }

    public String gotopage() {
        return "success";
    }

    public Collection<String> getSelection() {
        return selection;
    }

    public void setSelection(Collection<String> selection) {
        this.selection = selection;
    }

    public String getRowValue() {
        return rowValue;
    }

    public void setRowValue(String rowValue) {
        this.rowValue = rowValue;
    }

}

Метод selectionListener получает удар каждый раз, когда пользователь нажимает на элемент строки, не выдается ошибка, но ничего не происходит.
XHTML

        <h:form>
            <rich:extendedDataTable
                value="#{backingBean.names}" var="rowItem"
                selection="#{backingBean.selection}" id="table"
                frozenColumns="2" style="height:300px; width:500px;" selectionMode="single">
                <a4j:ajax event="selectionchange" listener="#{backingBean.selectionListener}" />                    
                <rich:column>
                    <f:facet name="header">
                        <h:outputText value="vendor" />
                    </f:facet>
                    <h:outputText value="#{rowItem}" />
                </rich:column>
            </rich:extendedDataTable>
        </h:form>

Правило навигации

<navigation-rule>
        <from-view-id>*</from-view-id>
         <navigation-case>
            <from-action>#{backingBean.selectionListener}</from-action>
            <from-outcome>success</from-outcome>
            <to-view-id>/pages/dummyfolder/results.xhtml</to-view-id>
        </navigation-case>
</navigation-rule>

При использовании Richfaces 4 не удалось найти тег с версией.

1 Ответ

3 голосов
/ 05 октября 2011

Вы не можете перемещаться, возвращая String из метода действия listener .Вы можете сделать это только в реальных методах действия.Вам нужно установить тип возврата метода обратно на void и взять навигацию в свои руки с помощью NavigationHandler#handleNavigation().

public void selectionListener(AjaxBehaviorEvent event) {
    // ...

    FacesContext context = FacesContext.getCurrentInstance();
    context.getApplication().getNavigationHandler().handleNavigation(context, "#{backingBean.selectionListener}", "success");
}
...