1

カスタム UIData コンポーネントを作成しようとしていますが、Ajax に問題があります。最初の呼び出しは正常に機能しますが、後続の呼び出しで UIData の 'var' 属性を解決できません。デバッグしようとすると、最初の ajax 呼び出しがカスタム UIData を復元し、「var」を RequestMap に入れることがわかります。後続の呼び出しでは、restoreState が再度呼び出されないため、'var' 変数が空になります。

PS。この投稿はあまり SSCCE ではないことをお詫びしますが、非常に大きくなります。

4

2 に答える 2

1

私の答えは興味深いかもしれませんが、UIData 'var' がどのように解決されるかについては答えていません。答えは、UIData 処理の各反復/フェーズで setRowIndex(int) メソッドが呼び出され、リクエスト マップの dataModel からのデータで「var」属性を設定することです (以下の抜粋を参照)。これは、JSF 1.2 の FaceletViewHandlingStrategy.locateComponentByClientId() によって呼び出される UIData メソッド invokeOnComponent または UIData.visitTree() によって呼び出されるか、状態管理戦略、ViewContextImpl などを含む JSF2 のさまざまな場所によって呼び出されます。

http://andyschwartz.wordpress.com/2009/07/31/whats-new-in-jsf-2/にアクセスする -Tree の下のこのリンクの変更を参照して ください。

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;
                }
            }
于 2013-05-07T19:17:37.687 に答える
1

問題は、私が使用していなかったことでした

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

保存および復元状態

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

もう 1 つの問題は、UIData の rowIndex をリセットしなかったことです。

 setRowIndex(-1);

の中に

public boolean visitTree(VisitContext context, VisitCallback callback)

これにより、保存された状態の ID がインデックスで調整され、次の復元フェーズでキー ミスが発生します。

于 2013-05-06T18:45:48.800 に答える