通过BootsFaces数据表获取传递给Java函数的空值

时间:2018-11-09 22:10:43

标签: jsf datatable bootsfaces

我正在尝试创建一个模式,以将用户选择的请求发送到电子邮件地址;但是,我在获取用户选择的请求时遇到了麻烦。我不断通过fooBean.setSelected(id)传递空值。


版本:

  • BootsFaces:1.3.0
  • Java:1.8.0
  • JSF:2.0
  • 浏览器:Internet Explorer 11.2x

thisThing.xhtml的MCVE:

<b:dataTable value="#{fooBean.newRequests}"
    var="foo"
    onselect="ajax:fooBean.setSelected(id)"
    ondeselect="ajax:fooBean.setSelected(id)"
    selectedItems="row"
    selection-mode="multiple"
    selectedRows="#{foo.selected}"
    saveState="false">

    <b:dataTableColumn label="Select">
        <b:selectBooleanCheckbox value="#{foo.selected}" />
    </b:dataTableColumn>

    <b:dataTableColumn label="Status" value="#{foo.status}" />

    <b:dataTableColumn label="Request Number"
        value="#{foo.requestNumber}"
        data-type="string" />

    <b:dataTableColumn label="ID" value="#{foo.id}" />

    <b:dataTableColumn value="#{foo.storeName}"
        label="Store Name" />
</b:dataTable>

fooBean.java的MCVE:

@ManagedBean(name="fooBean")
@ViewScoped
public class fooBean extends BeanBase implements Serializable {

    private List<FooRecord> fooRecords = new ArrayList<FooRecord>();
    private List<FooRecord> selectedFooRecords = new ArrayList<FooRecord>();

    // ...

    public void setSelected(String requestId) {
        // This is not how I really do it, but it gives an idea
        // with what I intend to do.
        this.fooRecords.stream().filter(...).toggleSelection();
        this.selectedFooRecords.stream().filter(...).toggleSelection();
    }
}

更新:

我发现我有一个名为getSelect而不是getSelected的方法,因此我对其进行了修复,然后完成了这一部分。我只记得真正的问题,那就是为什么要传递空参数而不是requestId。当我通过fooBean.getSelected(String requestId)调试时,它显示null被作为参数传递。我什至尝试过:

<!-- Using varName.property -->
onselect="ajax:fooBean.setSelected(foo.id)"

<!-- Using just the property name -->
onselect="ajax:fooBean.setSelected(id)"

<!-- Using the loop variable -->
onselect="ajax:fooBean.setSelected(foo)"

更新2:

Fired function with null parameter

如何将foo.id传递给函数?

1 个答案:

答案 0 :(得分:0)

您只能将三个参数传递给bean方法:

  • 循环变量。在您的示例中,为foo。仅当属性selected-items设置为rows时,此参数才有效。警告:如果激活列或单元格选择模式,此参数仍将传递给服务器,并且似乎有效。只是该对象的每个属性都为空。
  • typeOfSelection。这是"row""column""item"。它确定用户选择了什么。这又取决于属性selected-items,因此您几乎不必使用此参数。只需从参数列表中忽略它即可。
  • indexes告诉JSF bean选择了哪些行,列或单元格。请注意,在前两种情况下,这是一个单独的数字,或者-如果选择了多个项目,则是一个逗号分隔的列表。如果设置了selected-items =“ cell”,则索引是用逗号分隔的对象列表,其中包含行和列的索引。

我认为indexesfoo是您情况下最有用的参数。

最后一句话:我们想增加更多的灵活性,但这甚至比我们还需要更多地了解JSF的内部API。说实话,我什至不确定我们是否可以在不修改JSF引擎本身的情况下传递任意bean值。如果有人知道该怎么做,请在our bug tracker上留言。

更新: 也许问题是由模态引起的。模态在加载时渲染,但是稍后在用户选择行时显示。事实是,除非您将模式的内容添加到update属性中,否则不会自动重新渲染模式。