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>  

myBeanjavaは次のとおりです。

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+")");
}  

ScrollDatajavaは次のとおりです。

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

idは、DBから読み取られたScrollDataのプロパティです。

xxx値は投稿中にのみ検査されるので、eachRowはテーブルの最後のレコードに配置されます...そしてそれは間違っています。
このメカニズムは、DataTableで使用されていない場合は問題なく機能し、ページの作成中にgetId()メソッドが呼び出されることがわかります(これは正しいです)。

4

1 に答える 1

0

これは予期される動作です。これ<f:attribute>は、その単一の親 UIComponent に関連付けられ、ビューのビルド時に処理されるタグ ハンドラーです。実際には、JSF UI コンポーネントが XHTML マークアップに基づいて解析される場合、すべてのタグ ハンドラが評価され、適用されます。あなたの場合、JSF コンポーネント ツリーには<h:inputText>、ビューのレンダリング時にすべての行の反復中に再利用されるコンポーネントが 1 つだけ含まれています。ビューのレンダリング時に が再評価されること<f:attribute>はありません。したがって、ビューの作成時に使用可能だった値のみが保持されます。つまり、 が含まれていますnull

とにかく機能要件を達成する方法はいくつかありますが、そのうちの1つは、値変更リスナーメソッドで#{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 に答える