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

无法更新Primefaces中p:dataTable(不是整个p:dataTable)中的组件

荆运诚
2023-03-14

我正在使用Primefaces 3.3.1和Tomcat 7.0.22.0。我有p:dataTable,其中有p:inputtext。p:dataTable的id是“housetabid:tabview:form0:table”。这是从HTML源复制粘贴的。并且我让dialog(在dataTable所驻留的表单之外)通过p:dataTable中的按钮打开,并且该对话框中的p:CommandButton更新dataTable。

P:CommandButton看起来是这样的;

<p:commandButton ajax="true" action="#{myBean.setInputText()}"
    value="OK"
    update="#{myBean.getUpdateTarget(0)}"/>

myBean.getUpdateTarget(0)将正确的字符串返回到指向目标组件。

我可以通过指定“housetabid:tabview:form0:table”(意思是MyBean.getUpdateTarget(0)返回该字符串)来成功更新整个dataTable。但是我在表中有很多行,所以更新整个表需要更长的时间来完成,并且滚动位置被重置,这真的很恼人。这使我只想更新表中的一行,而不是整行。

所以我首先返回“housetabid:tabview:form0:table:inputbox”来更新我要更新的p:inputtext。在p:dataTable中,我有如下所示的内容;

<p:column headerText="Value"
    width="300" style="height:16px; font-size:9pt;">
    <p:inputText id="inputBox" value="#{myItem.value}"
        style="width:95%; height:11px; font-size:9pt;">
        <f:ajax execute="@this" event="blur" />
    </p:inputText>
</p:column>

结果:没有更新,没有错误日志。我知道“housetabid:tabview:form0:table:inputbox”不能工作,因为它没有在表中指定行。因此,通过使用rowIndexVar,我尝试使用“housetabid:tabview:form0:table:0:inputbox”,并使用rowIndexVar的make:0:part。该字符串是从HTML源复制粘贴的。但不幸的是,我有例外。

javax.faces.FacesException: Cannot find component with identifier ":houseTabID:tabView:form0:table:0:inputBox" referenced from "houseTabID:j_idt181:j_idt186".

为什么?显然有“Housetabid:TabView:Form0:Table:0:InputBox”,我在HTML源代码中看到了它,我可以用“Housetabid:TabView:Form0:Table”更新整个talbe,但用“Housetabid:TabView:Form0:Table:0:InputBox”抛出异常?这对我来说没有意义。那么,为什么它不会抛出任何异常或溢出带有“housetabid:tabview:form0:table:inputbox”的错误日志呢?我验证了p:commandButton HTML源;

onclick="PrimeFaces.ab({source:'houseTabID:j_idt190:j_idt195',update:'houseTabID:tabView:form0:table:inputBox',

我非常希望只更新一行,而不是整个p:dataTable。请帮帮我.

共有1个答案

阎佑运
2023-03-14

我找到了解决办法。根据这次谈话,

position = JQuery(".ui-datatable-scrollable-body").scrollTop();
JQuery(".ui-datatable-scrollable-body").scrollTop(position);

能做到这一点。这似乎是获取和设置p:dataTable垂直滚动位置的唯一方法。我在打开对话框之前保存了位置,并在从对话框更新p:dataTable之后设置了位置。这是我想做的。

但上述方法存在严重的问题。该代码从顶部扫描给定的类“.ui-dataTable-scrollable-body”,并在第一个找到的类中执行。因此它只适用于一个p:dataTable。幸运的是,我能想出第二种解决方案。

<script type="text/javascript">
    $ = jQuery;
    var scrollPos;
        function saveScrollPos()
        {
            scrollPos = $("#houseTabID\\:tabView\\:form0\\:table_data").parents(".ui-datatable-scrollable-body").scrollTop();
        }
        function getScrollPos()
        {
            $("#houseTabID\\:tabView\\:form0\\:table_data").parents(".ui-datatable-scrollable-body").scrollTop(scrollPos);
        }
</script>

FireFox中的FireBug帮助我找到了PrimeFaces使用的组件id“_data”。请看我的问题,我的数据表的id是“table”,有人创建了“table_data”。我可以用上面所示的转义语法来指向它,而函数parents()则指向这个位置。它在我的应用程序中运行良好。

我真的很感谢stier01,他发布了他的解决方案,这是我能在网上找到的唯一一个。而且我真的感到悲哀的是,Primefaces p:DataTable不支持这样一个基本的东西。我知道我们很多人都希望在更新时保持p:dataTable的滚动位置。我希望在不久的将来它会得到改善。

 类似资料:
  • 问题内容: 我只需要更新,而不需要更新整个表单。我尝试使用,,,但没有人正在为我想。使用时,它正在检查不需要执行的验证。 我该如何实现? 问题答案: 首先,仅因为它根本不支持该属性,它的确不会与一起使用。也许您真的打算使用? 修复a身份后, 阅读完该答案后,您应该已经发现数据表在该特定的代码段中由标识。因此,应该采取以下所有措施: 请注意,直到PrimeFaces 3.3为止,在某些复杂的UI组合

  • 一些基本信息: -Primefaces版本:5.3 -Primefaces扩展版本:3.1.0 -Java Server Faces:2.0 我从出处删除了一些东西(替换为-) 如果你需要更多的信息让我知道。也许是因为我在文件开头的xhtml/jsf声明?

  • 我正在尝试更新中选定的行(对象),当用户单击上下文菜单,但绑定到的对象没有根据行选择/上下文菜单的单击进行更新时,调试显示bean中的对象属性不包含任何更新值,而是为空。 代码为: 我被困在这里了。如有任何帮助,我将不胜感激

  • 问题内容: 我有一个datable,其中包括primefaces的过滤器功能。可以在表上执行某些操作(例如,编辑)。在使用ajax完成用户操作之后,将更新datable。如果不过滤数据表,它将直接更新表并运行良好,不幸的是,如果我使用它并对其进行编辑,则不会。 这就是我的数据表的样子: 和触发更新的按钮 问题答案: 更新后 的数据表 ,你必须调用它的客户端的方法。 对于早于5的PrimeFaces

  • 问题内容: 我有一个问题要Ajax更新ui:repeat。更新是从ui:repeat外部的commandButton触发的(请参见下面的代码)。需要可变的 priceHour 来计算其他价格(周,Monat ..) 当我单击按钮时,什么也没有发生,并且ui:repeat和价格未更新。怎么了? 我也尝试过 更新“ myForm:alvs” , 更新“:myForm:alvs” :什么都没有! 我正在