EL 上下文如何解析 UIData 'var'属性?



我试图创建一个自定义的UIData组件,我有问题与Ajax。第一次调用工作正常,但随后的调用无法解析我的UIData 'var'属性。当尝试调试时,我可以看到第一个ajax调用恢复了我的自定义UIData,并将"var"放入RequestMap中。但是,后续调用不会再次调用restoreState,导致'var'变量为空。

p。很抱歉这篇文章不是很SSCCE,但它会非常大。

问题是我没有使用

UIComponentBase.restoreAttachedState(context, values[1]);
UIComponentBase.saveAttachedState(context, getValue());

保存和恢复状态

public Object saveState(FacesContext context)
public void restoreState(FacesContext context, Object state) 

另一个问题是,我没有重置UIData的rowIndex

 setRowIndex(-1);
中的

public boolean visitTree(VisitContext context, VisitCallback callback)

这会导致使用索引调整保存状态的id,从而在下一个恢复阶段中丢失一个键。

虽然我的回答可能对一些人来说很有趣,但它没有回答如何解决UIData 'var'。答案是,在UIData处理的每个迭代/阶段中,调用setRowIndex(int)方法,该方法使用请求映射中的数据模型中的数据设置"var"属性(参见下面的摘录)。这是由JSF 1.2中的FaceletViewHandlingStrategy.locateComponentByClientId()调用的UIData方法invokeOnComponent或UIData. visittree()调用的,或者由JSF2中的各种地方调用,包括状态管理策略,ViewContextImpl和许多其他方法:

查看-树访问下的此链接的更改http://andyschwartz.wordpress.com/2009/07/31/whats-new-in-jsf-2/

关于visitTree的文档:http://docs.oracle.com/cd/E17802_01/j2ee/javaee/javaserverfaces/2.0/docs/api/javax/faces/component/UIComponent.html visitTree (javax.faces.component.visit.VisitContext javax.faces.component.visit.VisitCallback)

这是UIData的摘录:

String var = (String) getStateHelper().get(PropertyKeys.var);
        if (var != null) {
            Map<String, Object> requestMap =
                  getFacesContext().getExternalContext().getRequestMap();
            if (rowIndex == -1) {
                oldVar = requestMap.remove(var);
            } else if (isRowAvailable()) {
                requestMap.put(var, getRowData());
            } else {
                requestMap.remove(var);
                if (null != oldVar) {
                    requestMap.put(var, oldVar);
                    oldVar = null;
                }
            }

最新更新