2012-07-19 43 views
2

我尝试在backing bean中创建一个InputField并将其添加到视图中,但数据绑定似乎只能以只读方式工作。JSF绑定与setValueExpression只读?

我的支持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(...)作品至少是只读的。

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

的operandValues是simpe对象数组:

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

可这有什么关系我传递给setValueExpression(...)具体的数据类型? 我试过对象,但没有改变任何东西。

任何想法为什么发生这种情况? 在此先感谢!

回答

2

我找到了解决我的问题的方法。老实说这是@BalusC的一篇文章使用数据表:填充数据表是什么使我走上了正确的道路。

以前我在PreRenderView-Phase阶段添加了组件,然后我在你的例子中看到了你在getter中填充绑定组件ONCE(这显然是在RestoreView-Phase的早期阶段)。这就是我现在所做的并且工作完美无瑕,Inputfields现在可以双向工作(读取和写入)。

非常感谢您的工作@BalusC!