0

1 つの列に各行のドロップダウン (1 つの選択肢を選択) が含まれ、別の列に各行の入力テキストが含まれるトリニダード テーブルがあります。

特定のオプションを選択すると、入力が編集可能になります (それ以外の場合は読み取り専用のままです)。

読み取り専用の動作と部分的なイベントは、期待どおりに完全に機能しています。問題は、入力テキストが編集可能から読み取り専用に移動することになっているときはいつでも、入力テキストが編集可能だったときに以前に入力された値が表示されることです。

ここから別のオプション (入力テキストも読み取り専用) を選択すると、値が消えます。

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 の [View Page Source] オプションにはテキストが含まれていません。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 に答える