Jsf Can';t在Primefaces中更新p:dataTable(不是整个p:dataTable)中的组件

Jsf Can';t在Primefaces中更新p:dataTable(不是整个p:dataTable)中的组件,jsf,primefaces,Jsf,Primefaces,我在Tomcat 7.0.22.0中使用Primefaces 3.3.1。 我有p:dataTable,其中有p:inputText。p:dataTable的id是“houseTabID:tabView:form0:table”。这是从HTML源粘贴的副本。我让对话框(在dataTable驻留的表单之外)通过p:dataTable中的按钮打开,该对话框中的p:commandButton更新dataTable p:commandButton看起来像这样 <p:commandButton aj

我在Tomcat 7.0.22.0中使用Primefaces 3.3.1。 我有p:dataTable,其中有p:inputText。p:dataTable的id是“houseTabID:tabView:form0:table”。这是从HTML源粘贴的副本。我让对话框(在dataTable驻留的表单之外)通过p:dataTable中的按钮打开,该对话框中的p:commandButton更新dataTable

p:commandButton看起来像这样

<p:commandButton ajax="true" action="#{myBean.setInputText()}"
    value="OK"
    update="#{myBean.getUpdateTarget(0)}"/>
<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: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。请帮帮我。

我在这里所知的边缘徘徊,但我怀疑这可能是因为页面构建的时间安排。构建DOM树时,表行还不存在,因此表外的按钮无法找到对该行的引用(因为它还不存在)。在构建树并填充数据之后,行就在那里了。这就是为什么在页面呈现之后,您可以查找列id,但不能从表外部引用它

我不确定有什么解决办法。也许您可以在datatable标记中放置一个远程命令来更新它。也许可以在JS中做些什么。

我找到了一个解决方案。根据对话,

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>

$=jQuery;
var-pos;
函数saveScrollPos()
{
scrollPos=$(“#houseTabID\\:tabView\\:form0\\:table_data”).parents(“.ui datatable scrollable body”).scrollTop();
}
函数getScrollPos()
{
$(“#housetab\\:tabView\\:form0\\:table_data”).parents(“.ui datatable scrollable body”).scrollTop(scrollPos);
}
FireFox中的FireBug帮助我发现有一个componnet id,Primefaces会显示“\u数据”。请看我的问题,我的数据表的id是“table”,有人创建了“table_data”。我可以用上面所示的转义语法指出它,函数parents()将指向该点。它在我的应用程序中运行良好


我真的很感谢斯蒂尔01,他发布了他的解决方案,这是我唯一能在网上找到的解决方案。我真的很难过Primefaces p:dataTable不支持这样一个基本的东西。我知道我们中的许多人都希望在更新p:dataTable时保持其滚动位置。我希望在不久的将来能有所改进。

试着使用@LuiggiMendoza所描述的答案,我在这里提问之前看到了这个对话。但这对我没有帮助。我需要从位于dataTable外部的对话框中更新p:dataTable中的组件。情况不同。这是一些你没有在问题中添加的信息。我唯一能处理这个问题的是,如果您的操作成功,您可以使用Javascript手动更新inputtext值。谢谢您的回答。单击表中的按钮并调用myBean.getUpdateTarget(0)时,我会更新对话框区域。函数在填充表之前返回“houseTabID:tabView:form0:table”(以避免异常)。所以我很确定当点击表中的按钮时,更新目标就在那个里。我需要想出一些解决办法。那么你什么时候会发现错误呢?是在您尝试查看页面时发生的吗?是在你点击命令按钮的时候吗?您在原始帖子中列出的onclick是在表中的commandbutton上,还是在对话框中?当我通过单击表中的commandbutton显示对话框时,会出现错误。第一次呈现视图时,myBean.getUpdateTarget(0)返回“houseTabID:tabView:form0:table”。当单击命令按钮时,我会更新对话框,以便再次调用myBean.getUpdateTarget(0),这次它返回“houseTabID:tabView:form0:table:0:inputBox”,但在该对话框中它是不可见的,我得到了错误。我仍在试图弄清楚为什么“houseTabID:tabView:form0:table:0:inputBox”是不可见的。我还在谷歌上搜索如何只更新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>