繁体   English   中英

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

[英]Can't update component in p:dataTable (not whole p:dataTable) in Primefaces

我正在将Primefaces 3.3.1与Tomcat 7.0.22.0结合使用。 我有p:dataTable其中有p:inputText。 该p:dataTable的ID为“ houseTabID:tabView:form0:table”。 这是从HTML源代码复制粘贴的。 然后,我通过p:dataTable中的按钮打开对话框(不在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”成功更新整个dataTable(这意味着myBean.getUpdateTarget(0)返回该字符串)。 但是我表中有很多行,因此更新整个表需要更长的时间才能完成,并且滚动位置被重置,这确实很烦人。 这使我只想更新表中的一行,而不是整个行。

因此,我首先返回了“ 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制作了:0:部分。 该字符串是从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。 请帮我。

我找到了解决方案。 根据这次谈话,

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附加的“ _data”组件ID。 请查看我的问题,我的数据表的ID是“ table”,并且有人创建了“ table_data”。 我可以使用上面显示的转义语法来指出这一点,而函数parent()会导致该问题。 在我的应用程序中,它运行良好。

我真的很感谢stier01,他发布了他的解决方案,这是我可以在网上找到的唯一解决方案。 对于Primefaces p:dataTable不支持这种基本功能,我感到非常难过。 我知道我们很多人都希望在更新p:dataTable时保持其滚动位置。 我希望它会在不久的将来得到改善。

我在这里所知道的边缘徘徊,但我怀疑由于页面构建的时机可能会发生这种情况。 构建DOM树时,您的表行尚不存在,因此表外的按钮无法找到对该行的引用(因为该行尚不存在)。 构建完树并填充数据后,该行就在那里。 这就是为什么在页面呈现后您可以查找列ID,但不能从表外部引用它的原因。

我不确定是否有解决方案。 也许您可以在datatable标签中放置一个远程命令来更新它。 也许可以在JS中做一些事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM