Вопрос по java, primefaces, jsf-2 – Как обновить только конкретную ячейку в элементах dataTable

9

Я создаю динамический набор данных, заполненный полями ввода. Иногда, когда пользователь вставляет значения в некоторые входные данные, необходимо обновить конкретную ячейку и только эту ячейку. Я думал, что это может быть просто, но пока не помогло. Ячейка, которую я хочу обновить - это «общая сумма», эта ячейка должна обновляться при изменении значения двух других ячеек:

cell to update

EDITED

js chrome

Я попытался использовать f: ajax с полным идентификатором и получил "Компонент с идентификатором: lancamentoNF: popupLancamentoNF: tabelaItensNF: 0: valorTotalItem not found". Изменено на p: ajax, и никаких ошибок не происходит, но это не обновляет !!

<h:panelGroup id="painelItensNF" layout="block" styleClass="hrgi-div-form aba-lancamento-nf clearfix" style="overflow:auto;">
    <h:panelGroup layout="block" style="width: 1700px;">
        <p:dataTable id="tabelaItensNF" value="#{modeloTabelaDinamicaItemNF.itens}" var="itemEmbrulhado" styleClass="tabelaDinamica" height="174" style="width: 100%;" rowIndexVar="indice">
            ... (some columns)
            <p:column style="width: 5%"
                      headerText="quantidade">
                <hrgi:spinner id="quantidadeItem"
                              value="#{itemEmbrulhado.item.produto.detalheTributavel.quantidade}"
                              dinheiro="false"
                              fator="#{itemEmbrulhado.item.produto.detalheTributavel.unidadeFracionada?0.01:1}"
                              local="pt-BR" min="0.00" width="70">
                    <p:ajax event="change"
                            update="lancamentoNF:popupLancamentoNF:tabelaItensNF:#{indice}:valorTotalItem"
                            listener="#{controladorPopupLancamentoNF.calcularValorTotalItem(itemEmbrulhado)}" global="false" />
                    <f:convertNumber
                            maxFractionDigits="#{itemEmbrulhado.item.produto.detalheTributavel.unidadeFracionada?2:0}"
                            minFractionDigits="#{itemEmbrulhado.item.produto.detalheTributavel.unidadeFracionada?2:0}"
                            locale="pt-BR"
                            for="quantidadeItem"/>
                </hrgi:spinner>
            </p:column>
            <p:column style="width: 5%"
                      headerText="valor unitario">
                <hrgi:spinner id="valorUnitarioItem"
                              value="#{itemEmbrulhado.item.produto.detalheTributavel.valorUnitario}"
                              dinheiro="true" fator="0.01" local="pt-BR" min="0.00" width="70">
                    <p:ajax event="change" 
                            update="lancamentoNF:popupLancamentoNF:tabelaItensNF:#{indice}:valorTotalItem"
                            listener="#{controladorPopupLancamentoNF.calcularValorTotalItem(itemEmbrulhado)}" global="false"/>
                    <f:convertNumber type="currency" currencyCode="BRL" currencySymbol="R$ "
                                     maxFractionDigits="10" minFractionDigits="2" locale="#{cc.attrs.local}"
                                     for="valorUnitarioItem"/>
                </hrgi:spinner>
            </p:column>
            <p:column style="width: 3%"
                      headerText="valor total">
                <h:outputText id="valorTotalItem" value="#{itemEmbrulhado.item.produto.valorTotal}">
                    <f:convertNumber type="currency" currencyCode="BRL" currencySymbol="R$ "
                                     maxFractionDigits="2" minFractionDigits="2" locale="pt-BR"
                                     for="valorUnitarioItem"/>
                </h:outputText>
            </p:column>
            ... (more columns)
        </p:dataTable>
    </h:panelGroup>
</h:panelGroup>

Это работает, когда я обновляю PanelGroup «painelItensNF» с полным идентификатором, но фокус потерян, и пользователь должен найти ввод, который он работал, чтобы продолжить ...

Вам следует заменить принятый ответ, так как это представляется возможным. Xtreme Biker

Ваш Ответ

2   ответа
14

update="valorTotalItem", Это уже относительно текущей строки.

Итак, замени

<p:ajax ... update="lancamentoNF:popupLancamentoNF:tabelaItensNF:#{indice}:valorTotalItem" />

от

<p:ajax ... update="valorTotalItem" />
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded brevleq
Error: User Rate Limit Exceeded brevleq
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
0

что возможно обновить одну ячейку. Его идентификатор генерируется автоматически, поэтому вы не можете обновить этот компонент по идентификатору.
Вы можете попробовать переключиться на Primefaces 3.3 (пока не окончательный выпуск, но вы можете начать работать со снимком), и попробовать, если вы можете делать то, что вы хотите, используя селекторы Primefaces:http://www.primefaces.org/showcase-labs/ui/selectors.jsf
с этим у вас будет больше изменений, но я не уверен, что вы сможете это сделать.

Или вы можете обновить панель и добавить JavaScript, чтобы установить фокус на соответствующий компонент. выполнить javascript в «oncomplete» метод компонента p: ajax.

РЕДАКТИРОВАТЬ: Удалите индекс из обновления, чтобы он выглядел так: & quot;: lancamentoNF: popupLancamentoNF: tabelaItensNF: valorTotalItem & quot; И, конечно, BalusC прав, вы также можете просто использовать & quot; valorTotalItem & quot;

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded brevleq
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded brevleq

Похожие вопросы