Seam中参数值的评估

时间:2012-06-01 11:01:40

标签: java jsf xhtml attributes seam

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

如果有人回答我,谢谢! 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值只在post期间被检查,所以eachRow位于表的最后一条记录上......这是错误的。
当没有在DataTable中使用时,这种机制就可以了,我看到在创建页面时调用了getId()方法(这是正确的)。

1 个答案:

答案 0 :(得分:0)

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

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

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

另见: