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

Primefaces的命令链接仅适用于dataTable的第一页

羊舌阎宝
2023-03-14

我在p: dataTable中有一个带有p:命令链接的列,它有一个分页器。当用户单击命令链接时,会打开一个对话框,显示该行的数据。

数据表HTML代码:

<p:dataTable id="dtSample" value="#{sessionBean.sampleList}"
    binding="#{requestBean.dtSampleList}"
    paginator="true" paginatorPosition="bottom"
    paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
    rowsPerPageTemplate="#{10,25,50}"
    currentPageReportTemplate="({startRecord} of {totalRecords})"
    var="item" emptyMessage="No entries." rows="10" rowKey="#{item.id}">
    <p:column headerText="Id">
        <p:commandLink id="lnkSample"
            action="#{requestBean.onLinkClick(item)}"
            oncomplete="PF('dlgSample').show();"
            update="@(.dialogClass)">
            <h:outputText value="#{item.id}" />
                        </p:commandLink>
    </p:column>
    <p:column headerText="Code">
        <h:outputText value="#{item.code}" />
    </p:column>
    <p:column headerText="Description">
        <h:outputText value="#{item.descr}" />
    </p:column>
</p:dataTable>

请求bean:

public class RequestBean {

    private SessionBean sessionBean;

    private DataTable dtSampleList;

    public void init() {
        // load samle list
        loadSampleList();
    }

    public String onLinkClick(Sample sample) {
        getSessionBean().setSelectedSample(sample);
        return "success";
    }

    private void loadSampleList() {
        List<Sample> list = new ArrayList<Sample>();

        for (int i = 0; i < 100; i++) {
            Sample tmp = new Sample();
            tmp.setId(new BigDecimal(i + 1));
            tmp.setCode("code" + (i + 1));
            tmp.setDescr("desc" + (i + 1));
            list.add(tmp);
        }
        getSessionBean().setSampleList(list);

    }

// getters and setters

}

会话bean:

public class SessionBean implements Serializable {
    private static final long serialVersionUID = 1L;

    private List<Sample> sampleList;
    private Sample selectedSample;

    // getters and setters

}

对话框html代码:

<p:dialog id="dlgSample" closeOnEscape="true" widgetVar="dlgSample"
                    styleClass="dialogClass" modal="true">
    <p:panelGrid columns="1">
        <h:outputText value="Id: #{sessionBean.selectedSample.id}" />
        <h:outputText value="Code: #{sessionBean.selectedSample.code}" />
        <h:outputText value="Description: #{sessionBean.selectedSample.descr}" />
    </p:panelGrid>
</p:dialog>

当我单击数据表第一页上的链接时,将执行链接操作,并正确刷新显示行数据的对话框。但是当我移动到数据表的任何后续页面时,单击链接不会刷新对话框中的数据(未调用链接操作,因此对话框中的数据是错误的- selectedSample变量具有旧值)。当然,当我回到数据表的第一页时,命令链接再次工作(调用action方法并刷新数据)。

我做错了什么?为什么不在任何数据表页面上调用操作方法?

我正在使用Primefaces 5.2。

共有3个答案

尉迟明辉
2023-03-14

在p: dataTable行中放置p:Command dLink等组件时,应始终指定

process="@this"

所以,在你的情况下,我会尝试:

 <p:commandLink id="lnkSample"
        action="#{bean.onLinkClick(item)}"
        oncomplete="PF('dlgSample').show();"
        update="@(.dialogClass)">
        <h:outputText value="#{item.id}" />
 </p:commandLink>

这样做,您可以确保只处理单击链接的操作,而不会执行其他提交操作。

太叔弘壮
2023-03-14

我做错了什么?为什么不在任何数据表页面上调用操作方法?

导致该行为的一个常见错误是您的状态不一致:为了处理表单提交,JSF 将重新创建与先前请求中完全相同的视图,然后应用更改(执行操作)

如果这个新视图现在不同于提交之前的视图,那么每个动作都被中止并且不被调用。(涉及要素不同。即,如果您的commandLink在提交前< code > render = " true " ,则需要在< code > APPLY _ REQUEST _ VALUES -阶段< code > render = " true " 。

因此,根据您的描述,我假设您的表正在返回到第1页,这将从视图中删除第2页上的任何链接,并中止其视图操作,因为元素不再呈现。

出于同样的原因,第1页上的链接是有效的,因为即使您的表失去了对当前页面的跟踪,它也会呈现第1页,因此您拥有与之前相同的视图,因此提交工作正常。

您可以通过增加每页的元素数量来轻松验证这一点,并看到从第 2 页移动到第 1 页的每个链接现在都在工作。

但在没有看到整颗豆子的情况下,我只能这样假设。为了便于测试,将您的bean设置为< code>@SessionScoped,看看这是否能解决问题。

有关更多想法,请参阅这篇文章:命令按钮/命令链接/ajax动作/侦听器方法未调用或输入值未更新

龙毅
2023-03-14

问题似乎出现在PF数据表组件中。缺少第一个属性,添加这些属性后,所有页面上的commandLinks都按预期工作。

 类似资料:
  • 我正在做一个与运行时间有关的练习。exec(),我理解这个运行时。exec不是shell解释器,这就是为什么我执行“bash-c'command'”,但出于某种原因,我可以执行像ls这样的命令,但不能执行echo或重定向或多个命令。这些都不起作用: 这是我的java代码: 我使用以下语法运行上述命令: 这是有效的: 我在Ubuntu 20.04和zsh上使用openjdk 11.0.15。有人能告

  • 我在SpringWebFlux练习Reactor,我发现学习曲线非常陡峭。我想做的就是: 来自控制器的数据我查询站点设置,返回一个Mono。我对用户存储库进行了一次查询(以便稍后查明用户是否已经注册),该查询返回一个Mono。 现在我想做一些事情,比如: 编辑:问题是我在@PostConstruct中持久化设置,而我没有调用subscribe。

  • 问题内容: 关闭页面时,我使用此代码注销用户,但是单击其他链接(相同的网站)时,用户也会注销: 有什么方法可以区分链接导航和实际页面关闭吗? 编辑: 我目前已实现此解决方案,但是它缺乏检测页面重新加载的能力 问题答案: 尝试以下解决方案,希望对您有所帮助 要么

  • 我创建了一个简单的测试,用户使用OpenAm登录系统,然后注销。我把我的线程组放在一个循环中工作,在第一次迭代中它工作正常。但当它进入下一次迭代时,我的测试失败了,因为有人试图登录,当然他不能。 我有15个用户证书并创建了。jks文件基于它们。用户名是,例如“hperfteste001”等等。我配置了“Keystore Configuration”配置元素,并在系统中提供了路径和密码。属性文件 我

  • 我的selectOneMenu没有触发onchange事件。这是代码: selectOneMenu填充得很好,我可以选择不同的值。但我希望在更改选择后,页面会被刷新,即重新创建支持bean(RequestScoped)(onchange=“submit();”)?但是,当selectOneMenu中的选择被更改时,什么都不会发生。 此外,不调用值change listener PresetGrou

  • 我对JSF primefaces 3.1还是个新手。我试图构建一个“复杂”的表,但我无法使用dataTable找到一个好的解决方案(我需要一个排序组件)。 谢谢你

  • 问题内容: 我有3个具有相同ID的按钮,当他被点击时,我需要获取每个按钮的值。 这是我当前的脚本: 但这仅适用于第一个按钮,单击其他按钮将被忽略。 问题答案: 我有3个具有相同ID的按钮… 您的HTML无效,同一页面中的元素不能超过一个。 引用规格: 7.5.2 元素标识符:id和class属性 id =名称[CS] 此属性为元素分配名称。此名称在文档中必须唯一。 解决方案 :从更改为, 和 jQ

  • 在上面的例子中,我有3个配置:1。具有p:InputText 2的p:DataTable。h:带有p:InputText 3的DataTable。P:DataTable(带有H:OutputText) 和2个按钮:第一个清除数据,第二个应用数据 工作流: 加载新数据--单击“更新”按钮(假设您正在打开带有新数据的新表单) 问题:为什么带有p:inputtext的p:dataTable仍然存储手动更