5

我正在使用 PrimeFaces DataTable 来显示记录(在沙盒应用程序中随机生成)。我正在使用复选框选择版本。基本的 DataTable 可以完美运行,包括 Delete 和 Cancel 按钮(该功能只有在确认对话框中才真正可用)。我正在尝试向 DataTable 添加功能,以便在选中复选框时,根据选择启用或禁用页面上的其他控件。

换句话说,如果没有选择行(没有选中复选框),某些按钮和/或菜单项将被禁用或不呈现。通过单击复选框选择一行或多行应启用或呈现控件。我尝试过使用内置的 JavaScript 事件处理程序,但我无法完成这项工作。

现在我的页面显示一个 DataTable 5 列:一个复选框选择列,First Name,Last Name,Age。我使用简单的布尔复选框并使用 onclick 事件更新布尔值,在我的另一个沙箱中进行了类似的工作。不幸的是,这个 DataTable 中似乎没有任何类似的东西——或者如果有的话,我不知道如何实现它。

我的索引页:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.prime.com.tr/ui"
      xmlns:c="http://java.sun.com/jsp/jstl/core"
      xmlns:ui="http://java.sun.com/jsf/facelets">

    <body>

        <ui:composition template="./newTemplate.xhtml">


            <ui:define name="content">
            <h:form>

                <p:dataTable rowSelectListener="#{tableBean.onRowSelect}" var="data" value="#{tableBean.data}" paginator="true" rows="10"
                     selection="#{tableBean.selectedNames}">

                <f:facet name="header">
                    Customer List
                </f:facet>


                <p:column selectionMode="multiple" />

                <p:column headerText="Cust ID">
                    <h:outputText value="#{data.id}" />
                </p:column>

                <p:column headerText="First Name">
                    <h:outputText value="#{data.firstName}" />
                </p:column>

                <p:column headerText="Last Name">
                    <h:outputText value="#{data.lastName}" />
                </p:column>

                <p:column headerText="Age">
                    <h:outputText value="#{data.age}" />
                </p:column>

                <f:facet name="footer">                        
                    <p:commandButton update="deleteList" value="Delete" oncomplete="deleteDlg.show()" />
                </f:facet>

            </p:dataTable>

            <p:dialog header="Delete Selected Records" modal="true" widgetVar="deleteDlg"
                      >

                <h:outputText value="You are about to permanently delete records." /><br /><br />
                <h:outputText value="Are you sure you want to continue?" /><br /><br/>

                <h:commandButton value="CANCEL" action="#{tableBean.cancelDelete()}" /> <h:commandButton value="Delete" action="#{tableBean.deleteNames()}" />
            </p:dialog>

        </h:form>
            </ui:define>

        </ui:composition>

    </body>
</html>

我的支持 bean 中可能相关的代码:

    public void deleteNames()
    {
        for(Data person : selectedNames)
        {
            data.remove(person);
        }   
    }

    public void cancelDelete()
    {
        for(Data name : selectedNames)
            selectedNames = null;
    }

    public void onRowSelect(SelectEvent event)
    {
        if(selectedNames == null || selectedNames.length < 1)
            setDisable(true);
        else
            setDisable(false);
    }

public boolean isDisable() {
        if(selectedNames == null || selectedNames.length < 1)
            disable = true;
        else
            disable = false;
        return disable;
    }

    public void setDisable(boolean disable) {
        this.disable = disable;
    }
4

3 回答 3

1

只是在寻找相同问题的解决方案,并且由于JSF 2 / Primefaces 近来发展非常快,因此找到了Primefaces 3.0或更高版本的更多最新解决方案。

根据 PrimeFaces 论坛主题中的以下答案:http: //forum.primefaces.org/viewtopic.php? f=3&t=1373&sid=bbfcd6a343edf586f927cd7ecd7d01b9&start=10#p48388

<p:datatable>可以通过执行以下步骤将客户端 javascript 处理程序添加到组件:

1.将 primefaces -extension JAR 添加到 webapp 的类路径(该库也可以在中央 Maven 存储库中以相同的名称获得)。我尝试0.6.3了撰写本文时最新的版本,它对我有用

2.将命名pe空间添加到相应的xhtml文件:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.prime.com.tr/ui"
      xmlns:c="http://java.sun.com/jsp/jstl/core"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:pe="http://primefaces.org/ui/extensions">

      ...

</html>

<pe:javascript>3.作为子元素添加到您的<p:datatable>组件中(实际上可以添加到任何实现 ClientBehaviorHolder 接口的组件中)如下所示:

<html>
    ...
    <p:dataTable rowSelectListener="#{tableBean.onRowSelect}" var="data" value="#{tableBean.data}" paginator="true" rows="10" selection="#{tableBean.selectedNames}">
        <pe:javascript event="rowSelect" execute="onRowSelectedHandler();"/>
        ...
    </p:dataTable>
    ...
</html>

应该就是这样,希望这会有所帮助......

于 2013-03-12T18:16:43.780 回答
1

确实有一种解决方法,至少对我有用。

  • 从 primefacess 中提取 datatable.js
  • 修改datatable.js selectRowWithRadio,selectRowWithRadio函数如下
        PrimeFaces.widget.DataTable.prototype.selectRowWithCheckbox = function(element) {
            ...
            ...
            //保存状态
            this.writeSelections();
    
            // 添加以添加即时行选择
            this.fireRowSelectEvent(rowId);
            // 结尾
        }
    
  • 将下面的 javascript 附加到数据表组件的末尾
    <p:datatable widgetVar="wv1" id='mydatatable' ....>
    ...
    <p:数据表/>
    <script type="text/javascript">
        如果(!wv1_main.cfg.onRowSelectUpdate){
            wv1.cfg.onRowSelectUpdate="";
        }别的{
            wv1.cfg.onRowSelectUpdate+="";
        }
        wv1.cfg.onRowSelectUpdate+="UPDATE_IDS";
    </脚本>
    
    将“UPDATE_IDS”替换为以空格分隔的面板 ID,例如“panel1 panel2”;
    将 'wv1' 替换为数据表 widgetVar 属性的值
  • 在要使用即时 ajax 复选框/radia 选择的 jsf 页面中导入修改后的 js。
    <h:标题/>
    ...
    <script type="text/javascript" src="#{CONTEXT_PATH}/resources/js/datatable.js"/>
    <h:标题/>
    

您可以通过更多修改突出显示选定的行

于 2011-01-16T12:50:23.050 回答
0

您可以捕获ajax选择行时触发的事件。

在你的情况下,

<p:dataTable rowSelectListener="#{tableBean.onRowSelect}" 
    var="data" value="#{tableBean.data}" paginator="true" rows="10"
    selection="#{tableBean.selectedNames}">

    <p:ajax event="rowSelectCheckbox" listener="#{tableBean.handleEvent}" 
        update="buttonThatNeedsToBeRendered"/>

    <p:column selectionMode="multiple" />

    ...

</p:dataTable>

根据 的选择模式触发的其他有用事件dataTable是:

  1. rowSelectrowUnselect
  2. rowSelectCheckboxrowUnselectCheckbox
  3. rowSelectRadio
  4. toggleSelect
于 2014-07-19T10:08:13.323 回答