0

ice:selectOneMenu で複数の選択を実装する方法を知りたいです。バッキング Bean の初期化時にロードされるおもちゃのリストがあり、UI には、おもちゃの各行に selectOneMenu の 1 つの列、つまりおもちゃ関数があるおもちゃのテーブルが 1 つあります。私の問題は、選択したおもちゃの機能をおもちゃの各行に表示することです。これまでのところ、次のコードを使用して selectOneMenu で選択した関数を表示できますが、異なる行に異なる選択を実装する方法がわかりません。つまり、各行にマップされるプロパティ「selectedToyFunction」が 1 つしかないことを意味します。のようなものを実装する必要がありjava.util.Map<ToyId,ToyFunction>ます。しかし、そのような実装を処理する方法と場所がわかりません。

JSPX

<ice:dataTable border="0" value="#{myBean.toys}" var="toy" scrollable="false"   resizable="false">
    <ice:column id="toyDetailRedirect" styleClass="smallColumn">
        <ice:selectOneMenu styleClass="inputCombo" partialSubmit="true" valueChangeListener="#{myBean.redirectToToyFunctionDetail}" value="#{myBean.selectedToyFunction}">
            <f:attribute name="toy" value="#{toy.id}" />
            <f:selectItems value="#{myBean.toyFunctions}" />
        </ice:selectOneMenu>
        <f:facet name="header">
            <ice:outputText value="Details" />
        </f:facet>
    </ice:column>
<ice:dataTable>

バッキングビーン

public class MyBean 
{    
    //--- Services ---
    private ToyService toyService;       

    //---- UI -----
    private String selectedToyFunction;
    private List<SelectItem> toyFunctions = new ArrayList<SelectItem>();

    //--- properties
    private List<Toy> toys = new ArrayList<Toy>();
    private static final String DEFAULT_SELECTION ="--- Select ---";
    private static final String FUNCTION_A ="A";
    private static final String FUNCTION_B ="B";
    private static final String FUNCTION_C ="C";

    // ---- Logging ----
    private final Logger logger = Logger.getLogger(MyBean.class);


    public MyBean()
    {
        super();
    }

    @PostConstruct
    public void loadToysAndPopulateToysFunctions( )
    {    
        // loadToys
        try
        {
            this.toys = this.toysService.findAllToys();
        }
        catch (Exception e)
        {
            this.logger.warn(e.getMessage());
            this.logger.debug(e);
        }

        if ((this.toys == null) || this.toys.isEmpty())
        {
            /* Out if not toy has been found */
            logger.debug("No Toy has been found !");
            return;
        }
        // Populate default toy  functions
        this.populateToyFunctions();
    }    

    private void populateToyFunctions( )
    {    
        if ((this.toyFunctions == null) || this.toyFunctions.isEmpty())
        {
            this.toyFunctions = new ArrayList<SelectItem>();
            this.toyFunctions.add(new SelectItem(DEFAULT_SELECTION));
            this.toyFunctions.add(new SelectItem(FUNCTION_A));
            this.toyFunctions.add(new SelectItem(FUNCTION_B));
            this.toyFunctions.add(new SelectItem(FUNCTION_C));             
        }
        //Default selection
        this.selectedToyFunction = DEFAULT_SELECTION;    
    }

    public void redirectToToyFunctionDetail(ValueChangeEvent e)
    {
        FacesContext.getCurrentInstance()
                            .getExternalContext()
                            .redirect("/Store/Details.jspx?id=" +e.getNewValue().toString());    
    }

     // ---- Getters & Setters -----

    public List<Toy> getToys( )
    {
        return this.toys;
    }

    public void setToys(List<Toy> toys)
    {
        this.toys = toys;
    }    

    public List<SelectItem> getToyFunctions( )
    {

      return this.toyFunctions;
    }

    public void setToyFunctions(List<SelectItem> toyFunctions)
    {
        this.toyFunctions = toyFunctions;
    }

    public void setSelectedToyFunction(String selectedToyFunction)
    {
        this.selectedToyFunction = selectedToyFunction;
    }

    public String getSelectedToyFunction()
    {
        return this.selectedToyFunction;
    }    
}
4

1 に答える 1

0

2つのオプションがあります:

  1. Toy値を現在繰り返されているオブジェクトにバインドするだけです。

    <ice:selectOneMenu value="#{toy.function}">
    

    そして、Toyまだ行われていない場合は、クラスに適切なプロパティを与えます。

    private String function;
    

    これは自然なアプローチです。

  2. 自分で提案したように、値を共通MapのBeanプロパティにバインドします。

    <ice:selectOneMenu value="#{myBean.selectedToyFunctions[toy.id]}">
    

    HashMap事前に準備しておいてください。

    private Map<Long, String> selectedToyFunctions = new HashMap<Long, String>();
    

    これは醜いアプローチにすぎません。Toy準備/永続化する前に、すべての変更を実際のオブジェクトとの間で手動でコピー/移動する必要があります。

于 2011-12-29T13:24:14.970 に答える