11

以前に閲覧したページの変数が、ダウンストリームで閲覧したページの変数 (たとえば、ah:datatable "var") に干渉したり、置き換えたりする可能性があることを 2 回見ました。

では、 ui:param のスコープは何ですか? それを封じ込める方法はありますか?

4

1 に答える 1

7

基本的に、EL コンテキストで新しい変数マッピングを設定します。のソース コードParamHandlerも参照してください。

94     public void apply(FaceletContext ctx, UIComponent parent)
95             throws IOException {
96         String nameStr = this.name.getValue(ctx);
97         ValueExpression valueVE = this.value.getValueExpression(ctx,
98                 Object.class);
99         ctx.getVariableMapper().setVariable(nameStr, valueVE);
100    }

99 行目に注意してください (Mojarra 2.1.0 と同様)。これVariableMapperは EL コンテキストから を取得し、 as valueを使用して変数マッピングを設定しValueExpressionます。

これには基本的に「グローバル」スコープがあります。したがって、変数名が「foo」の場合、「foo」を参照する同じ EL コンテキスト (基本的には現在の HTTP リクエスト) で評価されるすべての EL 式は、変数マッパーで指定された値式によって評価されます。 . varこれは、繰り返しコンポーネントがある場合、それよりも優先されます。したがって、これは実際に競合や「空の」ように見えるリピーターにつながる可能性があります。

<ui:param>または<h:dataTable var>別の名前を付けたほうがよいでしょう。<ui:param>たとえば、すべての(および<c:set>) 変数の前に_or soを付けることができます。

于 2012-11-05T11:49:35.140 に答える