rich:dataTable中的值未在bean中更新

时间:2013-12-12 10:14:19

标签: jsf jsf-2 richfaces

这个问题是我们迁移到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>

1 个答案:

答案 0 :(得分:1)

从JSF 1.2到JSF 2的一个重大变化是引入了renderexecute替换rerender的属性。

  • execute部分更新树标记部分的模型
  • render呈现树的标记部分,并通过AJAX发送,以替换原始部分。

这很方便,例如监听器更新值也会在页面上显示为输入字段。

更新:您在更改addNewRowToAnsChoice时致电answerId,稍后致电a4j:jsFunction addEmptyAnsChoice

元素ansChoiceListaddDiscQuestapplyDiscQuest会被重新呈现,但execute没有发送任何内容。因此,您输入answerId的行 - 井 - 永远不会在服务器端更新。

在下一步中,在actionListener中删除所有空行(也是这一行)并在底部添加一条新行。

IMO,尝试跳过jsFunction调用,而不是像f:ajaxa4j: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。

希望它有效并有所帮助......