Проблема, связанная с таблицей Тринидад, частичным триггером и только для чтения - PullRequest
0 голосов
/ 17 ноября 2011

У меня есть таблица тринидадов, в которой один столбец содержит раскрывающиеся списки (выберите один вариант) для каждой строки, а другой столбец содержит входной текст для каждой строки.

Когда выбрана конкретная опция, ввод становится редактируемым (иначе он остается только для чтения).

Поведение только для чтения и частичное событие работают идеально, как и ожидалось. Проблема заключается в том, что всякий раз, когда предполагается, что входной текст переходит из редактируемого в режим только для чтения, я все еще вижу значение, введенное ранее, когда вводимый текст был редактируемым.

Отсюда, если я выберу другую опцию (для которой вводимый текст будет также только для чтения), значение исчезнет.

Код 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>

Используемая версия: Тринидад 2.x JSF 2.x Tomcat 7.0

1 Ответ

1 голос
/ 14 декабря 2011

Хорошо, я заставил его работать некоторое время назад, но забыл опубликовать ответ ....

Я использовал 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();
    }
}
...