【问题标题】:RichFaces extendedDataTable disable sortingRichFaces extendedDataTable 禁用排序
【发布时间】:2015-02-07 07:17:53
【问题描述】:

我遇到了在单击按钮时禁用 RichFaces 按列排序的问题。 也许有人可以帮忙

我有 AlertsList 数据表:

<rich:extendedDataTable id="#{module}AlertsList"
                            tableState="#{alertsController.dataModel.tableState}"
                            enableContextMenu="false"
                            height="220px"
                            sortMode="single"
                            value="#{alertsController.dataModel}"
                            var="alert" width="100%"
                            selection="#{alertsController.selection}"
                            reRender="#{module}AlertsListDatascroller"
                            rows="#{alertsController.dataModel.rowsPerPage}"
                            binding="#{alertsController.dataModel.extandetDataTable}"
                            rowClasses="evenRow,oddRow">
        ......                  
        <rich:column sortBy="#{alert.lockedByUsername}" width="7%"
                     style="#{(not empty alert.first4OfLockedByUsername and (alertsController.dataModel.selectedItem != alert)) ? 'background-color: darkgray' : ((alert.action != null and alert.action.classificationTypeEntity.classificationType eq 'POSTPONED') ? 'background-color: thistle' : '')}"
                     label="#{message['alertsnalysis.alertList.table.lock']}"
                     selfSorted="#{currentUser.authorities['SVWI_MODIFICATION']}"
                     id="#{module}AL_lockedByUsername">
            <f:facet name="header">#{message['alertsnalysis.alertList.table.lock']}</f:facet>
            <h:outputText value="#{alert.first4OfLockedByUsername}" />
        </rich:column>
        ......
        <rich:column sortBy="#{alert.id}" width="5%"
                     style="#{(not empty alert.first4OfLockedByUsername and (alertsController.dataModel.selectedItem != alert)) ? 'background-color: darkgray' : ((alert.action != null and alert.action.classificationTypeEntity.classificationType eq 'POSTPONED') ? 'background-color: thistle' : '')}"
                     label="#{message['alertsnalysis.alertList.table.id']}"
                     selfSorted="#{currentUser.authorities['SVWI_MODIFICATION']}"
                    id="#{module}AL_id">
            <f:facet name="header">#{message['alertsnalysis.alertList.table.id']}</f:facet>
            <h:outputText value="#{alert.id}" />
        </rich:column>
        ....
        <rich:datascroller id="#{module}AlertsListDatascroller" for="#{module}AlertsList" ajaxSingle="false" page="#{alertsController.dataModel.currentPage}"></rich:datascroller>

所以我添加了一次将排序表结果更改为 3 列的按钮,因为由于我目前的认识,我无法通过单击不同的列标题对数据进行排序(不接受 sortMode="multiply" 的方式):

<h:form id="buttonReset">           
        <h:panelGrid columns="2">
            <a4j:commandButton id="resetSortingButton" styleClass="FatButtonStyle"  reRender="#{module}AlertsList"
                               action="#{alertsController.dataModel.defaultSortField}" value="Default Sorting"/>
        </h:panelGrid>



    </h:form>

我还有 Modifiable 的实现:

public abstract class TableDataModel<T, U> extends SerializableDataModel implements Modifiable, Serializable {  
    ...
    protected String sortField = null;
    ..
    public void defaultSortField(){ // call on button "Default Sorting" click action
        this.sortField  = "default";  //set field to default
        this.detached = false;
        this.defaultFlag = true;
        this.i = 0;
    }
    ...
    @Override
    public void walk(final FacesContext context, final DataVisitor visitor, final Range range, final Object argument)
            throws IOException {
        final int firstRow = ((SequenceRange) range).getFirstRow();
        final int numberOfRows = ((SequenceRange) range).getRows();
        if (detached) {
            for (final U key : wrappedKeys) {
                setRowKey(key);
                visitor.process(context, key, argument);
            }
        } else {
            List<T> list = Collections.<T>emptyList();
            if (rangeChanged((SequenceRange) range) || sortChanged(sortField) || filterMapChanged(filterMap) || descChanged(descending) || ((MethodReRendering) this).getReRenderingEnabled()) {
                lastRange = (SequenceRange) range;
                lastSortField = sortField;
                lastFilterMap = new HashMap<String, Object>(filterMap);
                lastDescending = descending;
                ((MethodReRendering) this).setReRenderingEnabled(false);
                list = findObjects(firstRow, numberOfRows, sortField, filterMap, descending); //in findObjects() checking if sortField == "default", then sorting by 3 columns, else by column in field value
                wrappedKeys = new CopyOnWriteArrayList<U>();
                for (final T object : list) {
                    wrappedKeys.add(getId(object));
                    wrappedData.put(getId(object), object);
                    visitor.process(context, getId(object), argument);
                }
            } else {
                for (U id :wrappedKeys)
                    visitor.process(context, id, argument);
            }
        }
    }
    ...

    public void modify(List<FilterField> filterFields, List<SortField2> sortFields) {
        filterMap.clear();
        SortField2 sortField2 = null;

        String expressionStr = null;
        ExtendedFilterField extendedFilterField = null;
        String value = null;
        Expression expression = null;
        if (sortFields != null && !sortFields.isEmpty()) {
            sortField2 = sortFields.get(0);
            expression = sortField2.getExpression();
            ......
    }
    ...
}

所以问题是当我单击我的 btn 时,我更改了 sortField 值,并且 walk() 方法将按 3 列排序的新数据返回到我的表中(请参阅 findObjects(firstRow, numberOfRows, sortField, filterMap, descending);)。 一切正常。

但是在我的页面上我仍然可以看到(通过图标或者如果我刷新我的页面,它会使用 List sortFields 参数 == "alertId" 调用 modify() 方法)这意味着哪些数据仍按 alertId 列排序,但实现了新的排序.我需要在我的 defaultSortField() 方法中添加什么逻辑(调用“默认排序”按钮单击),以禁用按 alertId 列排序?

更新1: 添加了将我的扩展数据表绑定到属性: 但也许有人知道我怎样才能禁用当前排序? UIExtendedDataTable extandetDataTable = null;

    public void setExtandetDataTable(UIExtendedDataTable extandetDataTable) {
        this.extandetDataTable = extandetDataTable;
        List<SortField2>  sortField2s = extandetDataTable.getSortFields();
        SortField2 sortField2;
    }

    public UIExtendedDataTable getExtandetDataTable() {
        return extandetDataTable;
    }

【问题讨论】:

    标签: jsf richfaces


    【解决方案1】:

    为什么不能使用sortMode=multi

    该表还具有 sortPriority - 一个用于排序的 id 列表,我假设您没有将列的 id 添加到 sortPriority 中,因此它会按那里的 id 进行排序。处理在org.richfaces.renderkit.SortingFilteringRowsRenderer.decodeSorting()完成。

    编辑:如果您想禁用排序,您可以在rich:column 上设置sortType="custom",但我不知道这是否会干扰您的实现。

    【讨论】:

    • 如何通过 btn 点击将新 id 添加到 sortPriority?(可能来自我的支持 bean)。请参阅 UPDATE1。
    • Thx,但是如何在单击“默认排序”按钮后将 sortType="custom" 属性添加到rich:column?
    • 后面你不加,你放到页面开头。
    猜你喜欢
    • 2011-07-15
    • 2012-02-22
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    • 2012-11-02
    相关资源
    最近更新 更多