当前位置: 首页 > 知识库问答 >
问题:

Ajax更新中断了Primefaces数据表功能

韩安顺
2023-03-14

在我的应用程序中,我有一个PF布局,在西部有一个树节点,在中部有一个内容部分,我想在其中使用ajax技术动态加载不同的页面
为了获得它,这个内容部分包含一个ui:include标记和EL表达式。当用户单击树节点按钮时,页面会正确地呈现在中间(这很好!)。但datatable的一些功能(如排序)已损坏或丢失<此外,如果从web浏览器中完全刷新页面,一切正常。

为了给你们一个清晰的例子,我简化了我的项目
索引。xhtml:

    <p:layout fullPage="true">
        <p:layoutUnit position="north" size="100" header="Top">
        </p:layoutUnit>

        <p:layoutUnit position="west" size="100" resizable="true"> 
            <h:form>
            <p:tree id="menuTree" 
                    value="#{menuController.root}"
                    var="node" 
                    selection="#{menuController.selectedNode}"
                    selectionMode="single">  
                <p:ajax event="select" update=":content" listener="#{menuController.setPage(node)}" />
               <p:treeNode>
                   <h:outputText value="#{node}" />
               </p:treeNode>
            </p:tree>
            </h:form>
        </p:layoutUnit>
        <p:layoutUnit position="east" size="50"/>

        <p:layoutUnit position="south" size="60"/>

        <p:layoutUnit position="center" id="centerlayout">   
            <h:panelGroup id="content">
            <c:if test="${not empty menuController.page}">
                <ui:include src="#{menuController.page}.xhtml" />
            </c:if>
            </h:panelGroup>
        </p:layoutUnit>
    </p:layout>
</h:body>

我想指出的是,我曾尝试用EL更改ui:include,并使用容器h:panelGroup和静态ui:include的条件呈现,但问题仍然存在。

Tree菜单的后备bean:

@Named
@SessionScoped
public class MenuController implements Serializable {

private TreeNode root;  
private TreeNode selectedNode;
private String pageName;

public MenuController() {  
    root = new DefaultTreeNode("Root", null);  
    TreeNode node0 = new DefaultTreeNode("Node 0", root);  

    TreeNode node00 = new DefaultTreeNode("/list", node0);  
    TreeNode node01 = new DefaultTreeNode("/list2", node0);     
}  

public TreeNode getRoot() {  
    return root;  
} 

public TreeNode getSelectedNode() {
    return selectedNode;  
}  

public void setSelectedNode(TreeNode selectedNode) {  
    this.selectedNode = selectedNode;        
}     

public void setPage(String page){
    this.pageName = page;       
}
public String getPage(){       
    return this.pageName;
}     

包含数据表列表的页面。xhtml(请注意,列表2.xhtml是相等的,将一些文本更改为“观看”内容更新):

<ui:composition>  

<h:form id="ItemListForm">

    <p:panel header="Title">

        <p:dataTable id="datalist" value="#{itemController.items}" var="item"
                     selectionMode="single" selection="#{itemController.selected}"
                     rowKey="#{item.itemid}"
                     paginator="true"
                     rows="10"
                     rowsPerPageTemplate="10,20,30" >

            <p:column sortBy="#{item.itemid}" filterBy="#{item.itemid}">
                <f:facet name="header">
                    <h:outputText value="Id"/>
                </f:facet>
                <h:outputText value="#{item.itemid}"/>
            </p:column>
            <p:column sortBy="#{item.productid}" filterBy="#{item.productid}">
                <f:facet name="header">
                    <h:outputText value="ProductId"/>
                </f:facet>
                <h:outputText value="#{item.productid}"/>
            </p:column>
            <p:column sortBy="#{item.name}" filterBy="#{item.name}">
                <f:facet name="header">
                    <h:outputText value="Name"/>
                </f:facet>
                <h:outputText value="#{item.name}"/>
            </p:column>
            <p:column sortBy="#{item.description}" filterBy="#{item.description}">
                <f:facet name="header">
                    <h:outputText value="Description"/>
                </f:facet>
                <h:outputText value="#{item.description}"/>
            </p:column>
        </p:dataTable>
    </p:panel>
</h:form>

ItemController bean:

@Named
@SessionScoped
public class ItemController implements Serializable {
private Item selected;
private List<Item> items;


public ItemController() {
    this.items = new ArrayList<>();
    this.items.add(new Item("1", "1", "Product 1", "testing sorting"));
    this.items.add(new Item("3", "3", "Product 3", "testing sorting"));
    this.items.add(new Item("2", "2", "Product 2", "testing sorting"));
    this.items.add(new Item("4", "4", "Product 4", "testing sorting"));
    this.items.add(new Item("5", "5", "Product 5", "testing sorting"));
    this.items.add(new Item("6", "6", "Product 6", "testing sorting"));
}

public Item getSelected() {
    return selected;
}

public void setSelected(Item selected) {
    this.selected = selected;
}    

public List<Item> getItems() {
    return items;
}

class项非常简单:

public class Item implements Serializable {

private String itemid;

private String productid;

private String name;

private String description;


public Item() {
}

public Item(String itemid) {
    this.itemid = itemid;
}

public Item(String itemid, String productid, String name, String description) {
    this.itemid = itemid;
    this.productid = productid;
    this.name = name;
    this.description = description;
}

public String getItemid() {
    return itemid;
}

public void setItemid(String itemid) {
    this.itemid = itemid;
}

public String getProductid() {
    return productid;
}

public void setProductid(String productid) {
    this.productid = productid;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}

最后,我正在使用:
JavaEE 7
PrimeFaces 3.5社区
JSF 2.2
Glassfish 4
NetBeans 7.3.1
Safari浏览器


共有2个答案

徐洛华
2023-03-14

很抱歉,我英语说得不好,但这是因为PF在页面中只包含成功呈现页面上存在的组件所需的javascript。如果您使用例如ui:include将组件直接包含到页面中,则页面将不包含用于呈现该组件的js

鞠源
2023-03-14

问题是,taht Primefaces 3.5与glassfish 4切换到Primefaces 4.0-SNAPSHOT不匹配,我想它可能会工作

 类似资料:
  • 问题内容: 我正在使用jQuery为HTML中的每个事件注册一个事件侦听器,如下所示: 如果用户更改的内容,则会触发这两个事件。但是,在按下update按钮(部分更新)之后,只有changeHandler之后才触发。绑定的事件不再触发。 这是PrimeFaces相关和/或预期的行为吗?如果是,那么我如何确保触发第二个事件而无需再次运行文档就绪脚本。 问题答案: 至于问题的原因,ajax请求将使用a

  • 我的xhtml中有下一个结构 方法searchAnimals()可以,它返回动物项,但dataTable不刷新,但在java代码(managedBean)中,ArrayList包含这些项。我能做什么?谢谢编辑:我正确地使用了de h:和p:后缀(我想是的),代码是完整代码的一部分,但它是无法正确工作的片段。在第一个面板中,我有一个过滤器控件(按类别、按日期等),命令按钮的功能是调用一个在数据库上执

  • 问题内容: 这是我的桌子的外观: 以及简化的代码: 该是一个字符串和两个整数,只有getter和setter。在计算第二整数从第一给定的行,也总让所有行。 因此,当我输入其中一个输入然后进行聚焦时,将调用侦听器并完成计算,但是在屏幕上,第三列中的值发生了变化,但总数固执地保持为零。我相当确定这与PrimeFaces关联,该行将行索引附加到每个输入和输出的生成ID中,但是我不知道如何在页脚中找到输出

  • 问题内容: 我有一个数据表。表中的每一行都有一个称为 “删除” ,这是为了从模型和视图中删除该行和执行就地更新。作为页脚,我还有一个叫做 “删除每一行” 。 最后一个按钮起作用。我单击它,从模型中删除每一行(即,包含元素的元素变为空),并在视图中将其重新渲染(或更新)。 另一方面,当我单击某一行上的按钮以将其删除时,它会部分起作用。相应的元素已从模型中删除,但视图未更新。该行仍在中,并且未更改。

  • 问题内容: 我想Ajax使用Primefaces更新JavaScript脚本。 我如何在showMarker中将该值更新为ajax? 问题答案: 将其放在JSF标记中并提供ID。 并有一个按钮或链接是否执行某些操作,并对此进行更新

  • 我有一个datatable,其中包含删除行的按钮,我想在之后刷新该表。刷新工作很好,除了一个案例,当我删除最后一个项目。我相信这是因为属性,它在ajax更新时表现不佳。它都在一个复合组件中,datatable是有条件呈现的,看起来都是这样的: 除了我从列表中移除最后一个项目(并希望表消失)的情况外,这工作得很好。通过ajax显示表不是问题,因为我添加的项目也没有提交,并且表在添加第一个项目后正确显