0

如何使用当前的报价和 h:selectManyCheckBox 中的选定项目创建 ofer_has_location 对象(从位置和报价连接对象)

<h:selectOneMenu id="companyidCompany" 
    value="#{oferController.selected.companyidCompany}" 
    title="#{bundle.CreateOferTitle_companyidCompany}"
    required="true" 
    requiredMessage="#{bundle.CreateOferRequiredMessage_companyidCompany}">
    <f:ajax event="valueChange" execute="companyidCompany"
        render="locationCollection" />
    <f:selectItems value="#{companyController.itemsAvailableSelectOne}"/>
</h:selectOneMenu>

<h:outputLabel value="#{bundle.CreateOferLabel_locationCollection}"
    for="locationCollection" />      
<h:selectManyListbox id="locationCollection" value="locations"
    title="#{bundle.CreateOferTitle_locationCollection}">                       
    <c:forEach items="locations">      
        <f:selectItems var="locations"
            value="#{oferController.selected.companyidCompany.locationCollection}" />
    </c:forEach>
</h:selectManyListbox>
4

1 回答 1

1

为了实现“连接元素”功能,您需要做什么:

  1. 有两个元素(<h:selectOneMenu><h:selectManyLisBox>您的情况下),其中第二个元素将取决于第一个元素的选定选项。第二个元素必须有一个 id 才能在之后重新渲染。
  2. 每个 HTMLselect元素(由您选择的两个 JSF 标签呈现)都会有一组options,它们不应该通过迭代元素<c:forEach>(尽管实际上是可能的)创建,而是通过<f:selectItem>/<f:selectItems>标签(因此,在评论中删除您的迭代标签)。
  3. 当组件中的值不是绑定为普通Strings 或原始包装器(Integer等),而是绑定为模型对象(YourClass对象等)时,您需要告诉 JSF 两件事:它如何从您optionvalue类以及它如何从作为字符串的请求参数重建对象。为此,您需要实现Converter,即解释 JSF 如何进行上述转换。使用这个答案BalusC 的博客作为参考点。<f:selectItems itemValue="..."> 请注意此处的适当语法。
  4. 由这两个组件绑定的模型值也需要表示您的类,就像所选项目的值一样。因为<h:selectOneMenu>它是value="#{}";因为<h:selectManyListbox>它分别是value="#{}"withYourClass selectOneMenuValueList<YourClass> selectManyListboxValues or YourClass[] selectManyListboxValuesbean 属性。
  5. 第二个人口select将通过<f:ajax>标签处理。由于内容需要“即时”计算,因此制作它的正确位置在其listener属性内(即拥有List<YourClass> contentsOfSecondListbox = createListboxValues(YourClass oneMenuSelectedOption);)。由于您希望重新呈现第二个元素,请在render属性中指定其客户端 ID <f:ajax>这里的例子。

例如,如果您要绑定到String/String[]值,则不需要转换器部件。

尝试一步一步地找出你的错误并纠正它们。

于 2013-04-30T18:01:40.757 回答