4

我正在使用 facelets jsf 2.0 和 primefaces 3.0.M2 组件库。我正在尝试实现动态行数,包括发生数据表选择时填充的输入字段。

每当进行选择时,都会使用输入字段正确生成动态行,但在第一次选择后续选择之后,动态行数会正确更改,但输入字段不会更新并继续显示第一次选择的输入。

这是我在 facelet 中迭代列表的方式;

<ui:repeat value="#{goalEntranceBean.selectedCard.parameterList}" var="prmBean" >
        <li><h:outputText value="#{prmBean.lookUp.value}"/></li>
        <li>

            <h:outputText value="Weight:"/>
            <p:inputText id="wx" required="true" value="#{prmBean.weight}">
            </p:inputText>
            <h:outputText value="Percent:"/>
            <p:inputText required="true" value="#{prmBean.percent}">
            </p:inputText>
        </li>

    </ui:repeat>

我的 bean,我在其中获取卡片列表并在数据表中使用 rowSelect 事件设置 selectedCard。

@ManagedBean(name = "goalEntranceBean")
@ViewScoped
public class GoalEntranceAction implements Serializable {

private List<ScoreCard> personalCards = new ArrayList<ScoreCard>();

    private ScoreCard selectedCard = new ScoreCard();
......
}

当我在调试模式下检查时,我可以看到真实的列表,但在屏幕上元素没有改变。

4

3 回答 3

4

这是一个常见问题(每隔几天就会被问到一次)。长话短说,ui:repeat 中的输入不起作用,句号。

这是 JSF 的一个问题,这是一个长期存在的著名问题。也许它会被修复。也许不是,似乎没有人真正关心(我的意思是 - 输入?在... ui:repeat?如此疯狂的场景!)。

一个快速修复方法是使用 ah:dataTable,它可能会被 css 滥用以使其看起来像一个列表。一个长期解决方案是使用来自不同库的一些迭代器。Primefaces 有一个可以呈现无序列表的元素。

于 2011-08-17T05:24:35.230 回答
2

感谢您的回复。抱歉忘记分享解决方案。正如我上面提到的,我有 primefaces 数据表。在行选择事件中,我呈现数据表并想要更新该数据表的单元格。使用 p:inputtext 轻松解决了我的问题。现在我可以更改屏幕上的数据,并且可以在屏幕上看到更新操作后的值。我不明白原因,但它有效。

  <p:dataTable var="orgPrmBean"
                 value="#{scoreCardOperationsBean.selectedCard.orgParameterList}"
                 emptyMessage="#{labels.norecord}"
                 rowKey="#{orgPrmBean.id}"
            >

        <p:columnGroup type="header">
            <p:row>
                <p:column headerText="Parameters" colspan="3" style="text-align:left;width:480;"/>
            </p:row>
        </p:columnGroup>


        <p:column style="text-align:left;width:200px;">
            <h:outputText value="#{orgPrmBean.info}"/>
        </p:column>

        <p:column style="text-align:left;width:180px;">
            <p:inputText value="#{orgPrmBean.weight}"
                         rendered="#{scoreCardOperationsBean.selectedCard.goalEdit}">
                <f:convertNumber maxFractionDigits="0"/>
            </p:inputText>

        </p:column>  

    </p:dataTable>
于 2012-02-13T09:06:46.733 回答
1

可以让它工作,但解决方案是将输入绑定到支持 bean,并通过侦听器更新支持 bean 中控件的值(使用参数中收到的新值)。显然,如果您有一个复杂的表单,这不是一个好的解决方案,因为您需要在支持 bean 中为页面中的每个控件添加一个侦听器/控件,但是如果您只有一个或两个输入,这很实用。

于 2011-12-13T19:02:04.447 回答