2

バッキング Bean で InputField を作成してビューに追加しようとしましたが、データバインディングは読み取り専用でしか機能しないようです。

次のように、Backing-Bean で UIInput を作成します。

UIComponent textInput = new UIInput();
textInput.setId("operandInputText");
textInput.setValueExpression("value", ef.createValueExpression(elCtx, "#{row.operandValues[0]}", String.class));        
textInput.setValueExpression("rendered", ef.createValueExpression(elCtx, "#{row.inputType == 'text'}", Boolean.class));     
mInputPanelGroup.getChildren().add(textInput);

panelGroup は dataTable の列内にあり、Bean にバインドされています。

<p:column id="operandColumn">
    <h:panelGroup id="inputPanelGroup" binding="#{locateEmployeeBean.inputPanelGroup}" >
        <h:inputText id="testInput" value="#{row.operandValues[0]}" />
    </h:panelGroup>
</p:column>

<h:inputText/>PanelGroupの内部はテスト用であり、ここで行ったバインディングsetValueExpression(...)が少なくとも読み取り専用で動作することがわかりました。

ブラウザには、最初に「testInput」、次に「operandInputText」の 2 つの入力フィールドがあります。「operandInputText」に値を入力して送信すると、値は保存されませんが、「testInput」フィールドに値を入力すると、値が送信され、さらに両方の入力フィールドに値が表示されます。

operandValues は単純なオブジェクト配列です。

private Object[] mOperandValues = new Object[2];

これは、私が渡す dataType と関係がありsetValueExpression(...)ますか? オブジェクトを試しましたが、何も変わりませんでした。

なぜこれが起こるのか分かりますか?前もって感謝します!

4

1 に答える 1

2

私の問題の解決策を見つけました。正直なところ、それは @BalusC Using Datatables: Populate datatable の記事で、私を正しい道に導きました。

以前、PreRenderView-Phase 中にコンポーネントを追加しましたが、あなたの例では、バインドされたコンポーネントを getter で ONCE に設定していることがわかりました (これは、RestoreView-Phase の間明らかにずっと早い段階です)。それが私が今行った方法であり、問​​題なく動作します。入力フィールドは両方の方法で動作するようになりました (読み取り + 書き込み)。

あなたの仕事@BalusCに感謝します!

于 2012-07-20T11:27:22.393 に答える