0

我有一个特立尼达表,其中一列包含每一行的下拉菜单(选择一个选项),另一列包含每一行的输入文本。

选择特定选项后,输入变为可编辑(否则保持只读)。

只读行为和部分事件按预期完美运行。问题是每当输入文本应该从可编辑变为只读时,我仍然会看到输入文本可编辑时之前输入的值。

从这里如果我选择另一个选项(输入文本也将是只读的),该值就会消失。

JSP代码如下:

<tr:table emptyText="No Data" var="vo" autoSubmit="true" partialTriggers="accountType"     value="#{testingBean.voList}" binding="#{testingBean.table}" width="50%">
<tr:column>
    <f:facet name="header">
        <tr:outputText value="Sl No" />
    </f:facet>
    <tr:outputText value="#{vo.slNo}" />
</tr:column>
<tr:column>
    <f:facet name="header">
        <tr:outputText value="Account Type" />
    </f:facet>
    <tr:selectOneChoice unselectedLabel="Select" id="accountType" value="#{vo.accountType}" 
        autoSubmit="true" immediate="true" valuePassThru="true"
        valueChangeListener="#{testingAction.optionsChanged}">
        <f:selectItems value="#{testingBean.options}" />
    </tr:selectOneChoice>
</tr:column>
<tr:column>
    <f:facet name="header">
        <tr:outputText value="Other" />
    </f:facet>
    <tr:inputText value="#{vo.otherType}"
        partialTriggers="accountType"
        readOnly="#{vo.readOnlyFlag}"></tr:inputText>
</tr:column>
</tr:table>

valueChangeListener 的代码如下:

public void optionsChanged(ValueChangeEvent vce) {
    try {
        System.out.println("Inside Method");
        testingBean = (TestingBean) FacesContext.getCurrentInstance()
                .getExternalContext().getSessionMap().get("testingBean");
        ArrayList<TableRowVO> list = testingBean.getVoList();
        UIXTable table = testingBean.getTable();
        TableRowVO vo = list.get(table.getRowIndex());
        vo.setReadOnlyFlag(true);
        vo.setAccountType(vce.getNewValue().toString());
        vo.setOtherType("");
        if (vce.getNewValue().equals("3")) {
            System.out.println("Setting false");
            vo.setReadOnlyFlag(false);
        }
        list.set(table.getRowIndex(), vo);
        table.setValue(list);
        testingBean.setVoList(list);
        FacesContext.getCurrentInstance().getExternalContext()
                .getSessionMap().put("testingBean", testingBean);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

这种行为是预期的吗?或者有解决方法吗?

有趣的是,Firefox 中的“查看页面源代码”选项不包含文本,即使我可以在页面上看到它。我不得不使用 FireBug 来分析显示以下内容的元素:

<div class="af_inputText_content" 
id="j_id_jsp_545172797_17:0:j_id_jsp_545172797_27">
tttt
</div>

使用的版本:Trinidad 2.x JSF 2.x Tomcat 7.0

4

1 回答 1

1

好的,所以我让它工作了一段时间,但忘记发布答案....

我使用 FacesContext 找到输入文本的 CoreComponent,然后重置组件值。

基本上:

  1. 找到 CoreTable 对象
  2. 找到 CoreColumn 对象
  3. 找到 CoreInputText 对象
  4. 重置 CoreInputText 的值

修改后的JSP代码如下:

<tr:table emptyText="No Data" var="vo" autoSubmit="true" partialTriggers="accountType" id="voTable" value="#{testingBean.voList}" binding="#{testingBean.table}" width="50%">
    <tr:column id="slNoCol">
        <f:facet name="header">
            <tr:outputText id="slNoHdr" value="Sl No" />
        </f:facet>
        <tr:outputText id="slNo" value="#{vo.slNo}" />
    </tr:column>
    <tr:column id="accountTypeCol">
        <f:facet name="header">
            <tr:outputText id="accountTypeHdr" value="Account Type" />
        </f:facet>
        <tr:selectOneChoice unselectedLabel="Select" id="accountType" value="#{vo.accountType}" autoSubmit="true" immediate="true" valuePassThru="true"  valueChangeListener="#{testingAction.optionsChanged}">
            <f:selectItems value="#{testingBean.options}" />
        </tr:selectOneChoice>
    </tr:column>
    <tr:column id="otherTypeCol">
        <f:facet name="header">
            <tr:outputText id="otherTypeHdr" value="Other" />
        </f:facet>
        <tr:inputText value="#{vo.otherType}" columns="15" partialTriggers="accountType" id="otherType" readOnly="#{vo.readOnlyFlag}" immediate="true">
        </tr:inputText>
    </tr:column>
</tr:table>

修改后的 valueChangeListener 的代码如下:

public void optionsChanged(ValueChangeEvent vce) {
    try {
        testingBean = (TestingBean) FacesContext.getCurrentInstance()
                .getExternalContext().getSessionMap().get("testingBean");
        ArrayList<TableRowVO> list = testingBean.getVoList();

        CoreTable table = (CoreTable) FacesContext.getCurrentInstance()
                .getViewRoot().findComponent("voTable");
        CoreColumn column = (CoreColumn) table
                .findComponent("otherTypeCol");
        CoreInputText text = (CoreInputText) column
                .findComponent("otherType");
        text.setValue("");//This is the trick....
        TableRowVO vo = list.get(table.getRowIndex());
        vo.setReadOnlyFlag(true);
        vo.setAccountType(vce.getNewValue().toString());
        vo.setOtherType("");
        if (vce.getNewValue().equals("3")) {
            vo.setReadOnlyFlag(false);
        }
        list.set(table.getRowIndex(), vo);
        table.setValue(list);
        testingBean.setVoList(list);
        FacesContext.getCurrentInstance().getExternalContext()
                .getSessionMap().put("testingBean", testingBean);

    } catch (Exception e) {
        e.printStackTrace();
    }
}
于 2011-12-14T15:00:53.193 回答