在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()方法(这是正确的)。
答案 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);
// ...
}
<f:attribute>
)。