【问题标题】:Selected row not returned correctly in p:dataTable [duplicate]p:dataTable中未正确返回所选行[重复]
【发布时间】:2020-02-07 21:05:25
【问题描述】:

我有一个使用 Primefaces 构建的数据表。它包含一个 "Person" 列表。 “Person”是一个只有 1 个 String 属性的 Java 类 - “name”,有没有参数的构造函数,有 1 个 String 参数的构造函数,“name”的 getter 和 setter。表的第一列包含人名。第二列包含一个命令按钮。通过按下它,打开一个对话框。在此对话框中,我想查看所选人员的姓名。 JSF 页面是这样的:

<h:form id="personForm" prependId="false">
<p:dataTable id="personEntitiesTable" var="pers" value="#{personView.persons}">
    <p:column headerText="Name">
        <h:outputText value="#{pers.name}" />
    </p:column>          
    <p:column headerText="">             
        <p:commandButton value="Details" type="button" onclick="PF('personDetails').show();" />
        <p:dialog header="Person details" widgetVar="personDetails" modal="true" height="150" >     
            Selected person is "#{pers.name}"
        </p:dialog>
    </p:column>
</p:dataTable>
</h:form>

表的 managedBean 是:

@ManagedBean
@ViewScoped
public classPersonView implements Serializable {
    private List<Person> persons;

    @PostConstruct
    public void init() {
        persons = new ArrayList<Person>();
        persons.add(new Person("John"));
        persons.add(new Person("Mary"));
        persons.add(new Person("James"));
    }

    // getters and setters
}

因此,如果我按下用户“Mary”的“详细信息”按钮,则会打开一个对话框,我希望在该对话框中看到“选定的人是 Mary”消息。问题是无论我在哪一行按下“详细信息”按钮,对话框内的消息都是“选定的人是詹姆斯”。 “詹姆斯”是列表中的最后一个人。

【问题讨论】:

  • 对于 n 个人,您将获得 n 个呈现的对话框,每个对话框具有 wiedgetVar personDetails。显然最后一个赢了。 WidgetVars 在呈现的 HTML 文档中必须是唯一的。
  • 而且您根本没有使用数据表的选择机制。您的标题和文字表明您正在努力实现这一目标:primefaces.org/showcase/ui/data/datatable/selection.xhtml
  • 1:将对话框放在数据表之外,2:这是 widgetvar 中其他问题的重复,不是唯一的,最后一个在这里获胜。让我找到重复的

标签: jsf primefaces datatable


【解决方案1】:

由于对话框是在数据表列中声明的,JSF 将为每个表行生成一个对话框。由于它们都使用相同的widgetVar,所以在执行PF('personDetails').show()时会调用最后一个。

试试这个方法:

  1. 将对话框放在数据表之外。
  2. 您的对话框必须使用托管 bean 属性 (personView.selectedPerson)。
  3. 详细信息按钮必须设置personView.selectedPersonpers 变量: &lt;f:setPropertyActionListener target="#{personView.selectedPerson}" value="#{pers}"/&gt; 并更新对话内容。

【讨论】:

  • 这是一种“改进”,但不能解释 OP 遇到问题的原因......
  • 我在 PersonView 中添加了属性,对于 p:commandButton 标签,我还添加了 update=":personDetails" 。问题依然存在。
  • 你确定你的对话框声明了数据表吗?否则 JSF 将为每个表格行生成一个对话框。由于它们都使用相同的widgetVar,因此在执行PF('personDetails').show()时将调用最后一个。
  • @CatalinVladu 检查你的按钮是否是这样的:
  • 我应用了这里所说的,并且有效:stackoverflow.com/questions/58322572/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-15
  • 1970-01-01
  • 2012-03-28
  • 2020-06-10
  • 1970-01-01
  • 2015-10-26
相关资源
最近更新 更多