Частичная визуализация будет работать только с @form? - PullRequest
4 голосов
/ 10 мая 2011

У меня странная ситуация, когда использование @parent или даже явных идентификаторов не работает в атрибуте update. Но @form отлично работает.

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

  1. Каждая запись в сетке имеет кнопку изменения
  2. После нажатия кнопки «Изменить» он изменит данные сервера, и кнопка исчезнет, ​​поскольку она будет отображаться только в том случае, если запись НЕ была изменена.

Кнопка изменения выглядит следующим образом:

<!-- this works, since it's using @form in the update attribute -->
<p:column>
    <p:commandLink
        value="modify record" 
        process="@this" 
        action="#{testUserBean.modifyRecord(user)}"
        update="@form"
        rendered="#{not testUserBean.isRecordModified(user)}" />
</p:column>

Обратите внимание, что атрибут update использует @form, который заставляет его работать: при нажатии кнопки изменения он обновляется и исчезает.

Замените его @this или @parent или идентификатором сетки, тогда он НЕ будет работать. Для меня очень логично использовать идентификатор сетки в атрибуте update, так как я хотел бы обновить сетку после нажатия на кнопку. Я пытался использовать rowIndexVar="rowIndex" и myGridId:#{rowIndex}:link, но все еще не работает.

<!-- this does not work -->
<p:column>
    <p:commandLink id="link"
        value="modify record" 
        process="@this" 
        action="#{testUserBean.modifyRecord(user)}"
        update="tblUser"
        rendered="#{not testUserBean.isRecordModified(user)}" />
</p:column>

Вот ресурсы для этого простого примера:

  1. Файл xhtml
  2. Файл JSF Bean
  3. Пользователь POJO bean

Я использую Tomcat 7, и это мои зависимости:

<dependency>
    <groupId>org.primefaces</groupId>
    <artifactId>primefaces</artifactId>
    <version>2.2.1</version>
</dependency>
<dependency>
    <groupId>com.sun.faces</groupId>
    <artifactId>jsf-api</artifactId>
    <version>2.0.4-b09</version>
    <scope>compile</scope>
</dependency>
<dependency>
    <groupId>com.sun.faces</groupId>
    <artifactId>jsf-impl</artifactId>
    <version>2.0.4-b09</version>
    <scope>compile</scope>
</dependency>

Попробовал также Primefaces 3.0.M1, но он также получил такое же поведение.

Пожалуйста, поделитесь своими идеями. Это ошибка или я что-то не так сделал?


UPDATE


Здравствуйте,

Я только что закончил некоторые испытания, но все по-прежнему не удается.

Тест 1 (с использованием update=":gridRPBDetails"):

Файл JSF:

<p:commandLink id="undoLink" value="Undo" process="@this"
    action="#{tInputBean.actionUndoRemoveRecord(rpbDetail)}"
    update=":gridRPBDetails"
    rendered="#{tInputBean.isRemoveRecord(rpbDetail)}"
    title="Batalkan buang data" />

Сгенерированный xhtml:

<a title="Batalkan buang data" onclick="PrimeFaces.ajax.AjaxRequest('/cashbank/faces/TInput.xhtml',
{formId:'j_idt38',async:false,global:true,source:'gridRPBDetails:0:undoLink',
process:'gridRPBDetails:0:undoLink',update:':gridRPBDetails'});" 
href="javascript:void(0);" id="gridRPBDetails:0:undoLink">Undo</a>

Тест 2 (с использованием update=":gridRPBDetails:#{rowIndex}:undoLink"):

Файл JSF:

<p:commandLink id="undoLink" value="Undo" process="@this"
    action="#{tInputBean.actionUndoRemoveRecord(rpbDetail)}"
    update=":gridRPBDetails:#{rowIndex}:undoLink"
    rendered="#{tInputBean.isRemoveRecord(rpbDetail)}"
    title="Batalkan buang data" />

Сгенерированный xhtml:

<a title="Batalkan buang data" onclick="PrimeFaces.ajax.AjaxRequest('/cashbank/faces/TInput.xhtml',
{formId:'j_idt38',async:false,global:true,source:'gridRPBDetails:0:undoLink',
process:'gridRPBDetails:0:undoLink',update:':gridRPBDetails:0:undoLink'});" 
href="javascript:void(0);" id="gridRPBDetails:0:undoLink">Undo</a>

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


UPDATE


Я только что обновил свой тест, используя:

<p:commandLink
    value="modify record" 
    process="@this" 
    action="#{testUserBean.modifyRecord(user)}"
    update=":mainForm:tblUser"
    rendered="#{not testUserBean.isRecordModified(user)}" />

Обратите внимание, что я использовал :mainForm:tblUser, и я попробовал другие варианты и все еще не смог:

  1. : MainForm: tblUser:
  2. : tblUser (когда я не определяю имя формы)
  3. : MainForm: tblUser: # {RowIndex}: LinkId

Но я замечаю одну вещь: независимо от того, что я выбрал для обновления, обновление всегда заканчивается как tblUser: 0

<a onclick="PrimeFaces.ajax.AjaxRequest('/cashbank/faces/test.xhtml',
{formId:'mainForm',async:false,global:true,source:'tblUser:0:j_idt33',
  process:'tblUser:0:j_idt33',
  update:'tblUser:0'
});" href="javascript:void(0);" id="tblUser:0:j_idt33">modify record</a>

Я пытался изменить tblUser: 0 на лету, используя firebug, чтобы просто tblUser , частичный рендеринг на сетке работает нормально.

Я начинаю думать, что это ошибка при попытке обновить сетку из записи сетки.


Ответы [ 3 ]

4 голосов
/ 10 августа 2011

Ответ на этот вопрос дан здесь .

Вот цитата из ответа:

Это больше похоже на вопрос о мохарре, оно должно работатьхорошо с моими лицами без обертки.Обходной путь должен поставить обертку.

  Code:
    <h:form id="frm">
       <p:outputPanel id="wrapper">
           <p:dataTable id="tbl">
           //...
               <p:commandButton update=":frm:wrapper" />
           //...
           <p:dataTable>
       <p:outputPanel>
    </h:form>

Извините за позднее обновление!

0 голосов
/ 12 мая 2011
<p:dataTable id="mytable"
       value="#{dataTableWithLinkBean.list}" var="item">
      <p:column>
        <f:facet name="header">
        Code
        </f:facet>
        <p:commandLink actionListener="#{dataTableWithLinkBean.viewDetail}"  
                oncomplete="dlg.show()" process="@this" 
                         update=":mainform:dialog_content">
            <h:outputText value="#{item.code}"/>
            <f:param name="code" value="#{item.code}"/>
        </p:commandLink>
      </p:column>
    </p:dataTable>



    <p:dialog widgetVar="dlg" modal="true" id="dialog"
         width="300" height="300">
    <h:panelGrid id="dialog_content">
         <h:outputText value="#{dataTableWithLinkBean.selectedCode}"/>
    </h:panelGrid>     
    </p:dialog>

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

update = ": mainform: dialog_content "

на

update = ": mainform: mytable "

в этом случае моя форма тега использует id mainform, как показано ниже:

Обратите внимание, что я не пробовал это.Я только что использовал в моем примере выше для рендеринга диалоговой панели частично.Удачи

Обновление: Хорошо, я попробую вот так, объединить с вашим обновленным постом

 <p:dataTable id="mytable"
       value="#{dataTableWithLinkBean.list}" var="item">
      <p:column>
        <f:facet name="header">
        Code
        </f:facet>
        <h:outputText value="#{item.code}"/>
      </p:column>
      <p:column>
        <p:commandLink value="Modify" 
               action="#{dataTableWithLinkBean.removeDetail(item)}"
               process="@this" 
               update="mytable"
               rendered="#{not dataTableWithLinkBean.isModifier(item)}">
        </p:commandLink>
      </p:column>
    </p:dataTable>

И в бобе

     public String removeDetail(ClassForTest item){
    for(ClassForTest o: list){
        if(o.equals(item)){
            //do something update to database
            item.setModified(true);
            break;
        }
    }
    return "";
}

    public boolean isModifier(ClassForTest item){
    return item.isModified();
}

И это сработало!после того, как я нажму на кнопку «Изменить», вызову метод removeDetail, выполните некоторые действия, обновите измененный статус.затем сделайте update = "mytable", и изменение ссылки пропало.

Я использую Mojarra 2.0.4 и primefaces 3.0.M2

FYI, я использую DataModel в качестве основыbean, просто простой список, поэтому нет rowIndexVar.Может быть, при использовании DataModel может возникнуть эта проблема.

0 голосов
/ 10 мая 2011

Посмотрите на сгенерированный HTML. Поскольку <p:commandLink> помещается в <p:dataTable>, его сгенерированный идентификатор клиента выглядит примерно так:

<a id="someformid:tblUser:0:link">

0 - это индекс строки таблицы.

Таким образом, когда вы используете относительный идентификатор update="tblUser" для <p:commandLink>, тогда он в основном будет искать someformid:tblUser:0:tblUser для обновления. Но этого не существует. Вместо этого вы хотели бы использовать абсолютный идентификатор, начиная с :.

<p:commandLink update=":someformid:tblUser">
...