这个问题是我们迁移到richfaces4.3和JSF2.0的时候。
上下文是:一个rich:dataTable在各自的列中采用answerId,answerDefinition等。在answerid列上执行onchange事件,其中添加了新行。
<rich:extendedDataTable rowKeyVar="currentRowVar"
value="#{DiscQuestMgtController.answerChoiceList}"
var="dataItem" rowClasses="row1, row2" id="ansChoiceList">
<rich:column width="160" sortable="false">
<h:inputText id="answerID" value="#{dataItem.answerId}"
onchange="addNewRowToAnsChoice('DiscQuestMgtForm',#{fn:length(DiscQuestMgtController.answerChoiceList)});" />
</rich:column>
<rich:column sortable="false">
<h:inputText id="choiceValue" value="#{dataItem.choiceValue}"/>
</rich:column>
<rich:column sortable="false">
<h:inputText id="definitionId" value="#{dataItem.definition}"/>
</rich:column>
</rich:extendedDataTable>
将值检索到dataTable时,工作正常。但是当我将值输入到answerId(第一个单元格)并转移焦点时,现有行完全被消除,从而创建一个新行。
addNewRowToAnsChoice ,JS方法,对输入的值进行少量验证,然后调用a4j函数.. addEmptyAnsChoice ..以下是代码,添加了支持bean中的新行。
// AddNewRow
public void addEmptyRow( ActionEvent ae )
{
removeEmptyChoiceRow();
String logStr = " DiscQuestMgtController:addEmptyRow()>>>";
logger.debug( logStr + " Entered" );
AnswerChoiceBean bean = new AnswerChoiceBean();
bean.setQuestionId( discQuestBean.getQuestionId() );
logger.debug( logStr + "Choice list size: answerChoiceList size-->",answerChoiceList.size() ); //@abc
if ( answerChoiceList.size() == 1 )
answerChoiceList.get( 0 ).setQuestionId( discQuestBean.getQuestionId() );
if ( !answerChoiceList.contains( bean ) )
answerChoiceList.add( bean );
logger.debug( logStr + " Returned" );
}
removeEmptyChoiceRow()检查是否存在任何空行并删除它们,以添加新行。 @abc,列表大小始终是默认值。 (页面加载总是有一行),虽然输入的值不会改变。请建议!!
这是a4j:function:
<a4j:jsFunction name="addEmptyAnsChoice"
render="ansChoiceList,addDiscQuest,applyDiscQuest"
actionListener="#{DiscQuestMgtController.addEmptyRow}"
oncomplete="focusToNewCell('DiscQuestMgtForm',#{fn:length(DiscQuestMgtController.answerChoiceList)});">
</a4j:jsFunction>
答案 0 :(得分:1)
从JSF 1.2到JSF 2的一个重大变化是引入了render
和execute
替换rerender
的属性。
execute
部分更新树标记部分的模型render
呈现树的标记部分,并通过AJAX发送,以替换原始部分。这很方便,例如监听器更新值也会在页面上显示为输入字段。
更新:您在更改addNewRowToAnsChoice
时致电answerId
,稍后致电a4j:jsFunction
addEmptyAnsChoice
。
元素ansChoiceList
,addDiscQuest
,applyDiscQuest
会被重新呈现,但execute
没有发送任何内容。因此,您输入answerId
的行 - 井 - 永远不会在服务器端更新。
在下一步中,在actionListener中删除所有空行(也是这一行)并在底部添加一条新行。
IMO,尝试跳过jsFunction调用,而不是像f:ajax
或a4j:ajax
那样执行相同的操作。 (未经测试的)代码可能如下所示......
<h:inputText id="answerID" value="#{dataItem.answerId}"
onchange="<yourValidationFunction>">
<a4j:ajax execute="@this"
render="ansChoiceList addDiscQuest applyDiscQuest"
actionListener="#{DiscQuestMgtController.addEmptyRow}"
oncomplete="focusToNewCell('DiscQuestMgtForm',#{fn:length(DiscQuestMgtController.answerChoiceList)});">
</a4j:ajax>
</h:inputText>
这样,您可以保留服务器端要更新的值的ID。
希望它有效并有所帮助......