【问题标题】:JSF dataTable with radio buttons带有单选按钮的 JSF 数据表
【发布时间】:2012-09-18 14:02:29
【问题描述】:

我想使用 JSF 和下表创建一个网页:

Item 1 | ( ) good ( ) ok ( ) bad
Item 2 | ( ) good ( ) ok ( ) bad
Item 3 | ( ) good ( ) ok ( ) bad
[…]

选中单选按钮后,我想立即提交并处理评级。 dataTable 的当前代码如下所示:

<h:dataTable value="#{bean.list}" var="item">
    <h:column>
        <h:outputText value="#{item.title}"/>
    </h:column>
    <h:column>
        <h:form>
        <h:selectOneRadio id="rate" value="#{bean.rate}">
            <f:selectItem itemValue="1" itemLabel="good" />
            <f:selectItem itemValue="0" itemLabel="ok" />
            <f:selectItem itemValue="-1" itemLabel="bad" />
            <f:ajax event="click" execute="rate" />
        </h:selectOneRadio>
        </h:form>
    </h:column>
</h:dataTable>

我现在面临的问题:我需要确定实际评分的项目。有人可以告诉我如何实现这一目标吗?

【问题讨论】:

    标签: jsf datatable radio-button


    【解决方案1】:

    您可以在多种技术中进行选择。例如,您可以在 bean 中使用 Map <h:selectOneRadio value="#{bean.ratePerItem[item]}"

    Map&lt;ItemClass, Integer&gt; ratePerItem;

    这样,您必须在地图中穿行寻找价值。满足您需求的更简单方法可能是使用存储项目的h:inputHidden

    或者,也许更好,f:setPropertyActionListener。这取决于你到底想要什么。

    【讨论】:

    • 谢谢,我刚刚尝试了 Map 方法,它有效,但我无法直接访问,which Item 被评分了,对吗? inputHidden 的方法对我来说听起来更好;你能详细一点吗?我将以下内容添加到我的标记中:&lt;h:inputHidden id="currentItem" name="currentItem" value="#{item}" /&gt;,但是如何访问 bean 中的项目?
    • 对不起,我以为我解决了问题,但我错了:(我现在有隐藏输入中的项目,但是如何获取bean中的项目?
    • 使用 Map 方法,您必须反复寻找真实值。事实上,这对于多选很有用。
    • h:inputHidden 可能会强制您转换为字符串并进行迭代。试试Map 方法。为什么你不想使用它?
    • 地图的问题是,我无法弄清楚,当事件触发时,当前点击了哪些项目,对吧?还是我理解错了?
    【解决方案2】:

    向 Item 类添加“rate”属性将帮助您轻松确定对哪个 Item 进行评级。

    <h:selectOneRadio id="rate" value="#{bean.rate}"
                <f:selectItem itemValue="1" itemLabel="good" />
                <f:selectItem itemValue="0" itemLabel="ok" />
                <f:selectItem itemValue="-1" itemLabel="bad" />
                <f:ajax event="click" execute="rate" />
            </h:selectOneRadio>
    

    把上面的代码改成

    <h:selectOneRadio id="rate" value="#{item.rate}">
                <f:selectItem itemValue="1" itemLabel="good" />
                <f:selectItem itemValue="0" itemLabel="ok" />
                <f:selectItem itemValue="-1" itemLabel="bad" />
                <f:ajax event="click" execute="rate" />
            </h:selectOneRadio>
    

    【讨论】:

    • 当然这在技术上是可行的,但是在这个特定的用例中,“速率”不应该与应用程序范围内的特定“项目”紧密耦合,因为它取决于当前记录的-在用户中!将其与“项目”分离为一对多关系在设计技术上是有意义的。换句话说,这个答案不是 OP 特定用例的正确解决方案。
    猜你喜欢
    • 1970-01-01
    • 2016-04-29
    • 2019-04-12
    • 2012-10-24
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    • 2013-03-25
    • 2012-02-25
    相关资源
    最近更新 更多