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>

PanelGroup内部<h:inputText/>仅用于测试,在这里我发现我所做的绑定setValueExpression(...)至少是只读的。

在浏览器中,我现在有 2 个输入字段,首先是“testInput”,然后是“operandInputText”。当我在“operandInputText”中输入一个值并提交时,该值不会被保存,但是当我在“testInput”-Field 中输入一个值时,它会被提交,此外该值会显示在两个 inputFields 中。

操作数值是一个简单的对象数组:

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

这可能与我传递给的数据类型有关setValueExpression(...)吗?我尝试了 Object,但这并没有改变任何东西。

知道为什么会这样吗?提前致谢!

4

1 回答 1

2

我找到了解决我的问题的方法。老实说,这是@BalusC Using Datatables 的一篇文章:Populate datatable 让我走上了正确的道路。

以前我在 PreRenderView-Phase 期间添加了组件,然后我在您的示例中看到您在 getter 中填充了一次绑定组件(这显然在 RestoreView-Phase 期间更早)。这就是我现在所做的并且它完美地工作,输入字段现在可以双向工作(读+写)。

非常感谢您的工作@BalusC!

于 2012-07-20T11:27:22.393 回答