1

在 af:attribute 我用来计算值,但我看到它仅在调用时才计算。
我需要使用可视化期间消耗的变量来指定值,因此如果它要求的值不在 f:attribute 引用的组件的生产期间,则该值将不正确。
我希望正确地说明我的问题。如何强制评估属性值?

如果有人回答我,谢谢!
xhtml是:

<rich:scrollableDataTable
        value="#{myBean.getScrollData(frm,sez)}"
        var="eachRow"
        rows="20"
    >
<rich:columns value="#{sez.getElements()}" var="info"
            index="index" sortable="false"
            >
<h:inputText id="txtf#{info.getId()}" value="#{eachRow.data[info]}"
    valueChangeListener="#{myBean.handle}"
    >
    <f:attribute name="xxx" value="#{eachRow.getId()}"/>
</h:inputText>
</rich:columns>
</rich:scrollableDataTable>  

myBean java是:

public void handle(ValueChangeEvent e){
    Object value = e.getNewValue();
    if ((value==null || value.equals("")) && e.getOldValue()==null) return;
    String xxx = e.getComponent().getAttributes().get("xxx").toString();
    System.out.println("handle("+xxx+","+value+")");
}  

ScrollData java 是:

private String id="";
public String getId(){ return id;}  

id 是从 DB 读取的 ScrollData 的属性。

我看到 xxx 值仅在发布期间检查,因此 eachRow 位于表的最后一条记录上......这是错误的。
在 DataTable 中不使用此机制时可以正常工作,并且我看到在创建页面期间调用了 getId() 方法(这是正确的)。

4

1 回答 1

0

这是预期的行为。这<f:attribute>是一个标签处理程序,它与它的单个父 UIComponent 绑定并在视图构建期间进行处理。实际上,当要基于 XHTML 标记解析 JSF UI 组件时,会评估和应用所有标记处理程序。在您的情况下,JSF 组件树仅包含一个<h:inputText>组件,该组件在视图渲染期间的每次行迭代中都被重用。在视图渲染期间不会重新<f:attribute>评估所以它仍然只保留在视图构建期间可用的值,即它包含null.

无论如何,有几种方法可以实现功能要求,其中一种是通过在值更改侦听器方法中以#{eachRow}编程方式进行评估。Application#evaluateExpressionGet()

public void handle(ValueChangeEvent e) {
    FacesContext context = FacesContext.getCurrentInstance();
    EachRow eachRow = context.getApplication().evaluateExpressionGet(context, "#{eachRow}", EachRow.class);
    // ...
}

也可以看看:

于 2012-06-04T13:05:46.950 回答