部分渲染只适用于@form?

时间:2011-05-10 04:54:02

标签: jsf jsf-2 primefaces

我有一个奇怪的情况,使用@parent,甚至显式id-s都不能在update属性中工作。但@form工作正常。

我做了一个非常简单的测试用例,其中包括一个简单的网格,其行为如下:

  1. 网格中的每条记录都有一个修改按钮
  2. 单击修改按钮后,它将修改服务器数据,按钮将消失,因为只有在未修改记录时才会呈现该按钮。
  3. 修改按钮如下:

    <!-- 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或网格的id替换它,然后它将无法工作。对我来说,在update属性中使用网格的id非常合乎逻辑,因为我想在点击buttton后刷新网格。 我尝试使用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. The xhtml file
    2. The JSF Bean file
    3. The user POJO bean
    4. 我正在使用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>
      

      也尝试了主要的3.0.M1,但它也有同样的行为。

      请分享您的想法。这是一个错误还是我做错了什么?


      更新


      您好,

      我刚刚完成了一些测试,但一切都还是失败了。

      测试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>
      

      在单击撤消按钮方面,两个测试仍然失败,无法刷新网格记录,甚至网格本身。


      更新


      我刚刚更新了我的测试:

      <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
      4. 但我注意到的一件事是,无论我为更新选择什么,更新总是以 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>
        

        我尝试使用firebug将 tblUser:0 动态修改为 tblUser ,网格上的部分渲染效果很好。

        我开始认为这是尝试从网格记录内更新网格时的错误。


3 个答案:

答案 0 :(得分:4)

这已在here中得到解答。

以下是答案的引用:

  

这更像是一个mojarra问题,它应该与myfaces一起使用   没有包装。解决方法是放置一个包装器。

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

对于最新的更新感到抱歉!

答案 1 :(得分:0)

查看生成的HTML。由于<p:commandLink>位于<p:dataTable>,因此其生成的客户端ID就是这样的

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

0是表格行索引。

因此,当您在update="tblUser"上使用相对标识符<p:commandLink>时,它将基本上搜索someformid:tblUser:0:tblUser进行更新。但这不存在。您希望使用绝对标识符,从:开始。

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

答案 2 :(得分:0)

<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>

上面是呈现对话框的数据表中链接的示例。 也许你可以尝试改变

更新= “的:MainForm中:dialog_content

更新= “的: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>

在支持bean中

     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

仅供参考,我在支持bean中使用DataModel,只是一个简单的List 所以没有rowIndexVar。也许在使用DataModel时,可能会产生这个问题。