当用户完成列重新排序时如何防止 renderHeaderCell() 调用

Posted

技术标签:

【中文标题】当用户完成列重新排序时如何防止 renderHeaderCell() 调用【英文标题】:How to prevent renderHeaderCell() call when column reorder is done by the user 【发布时间】:2015-02-05 18:27:07 【问题描述】:

我有一个带有以下声明的 Dojo 扩展 dgrid:

var myGridTemplate = declare([ OnDemandGrid,ColumnReorder,Keyboard,Selection,selector,Pagination,ColumnResiser]);

var myGrid = new myGridTemplate(
                
                    deselectOnRefresh : true,
                    cellNavigation : true,
                    loadingMessage : "Loading data...",
                    noDataMessage : "No data found.",

                columns : 

                    xyz : 
                            label : Mylabel,
                            width : 50,
                            renderHeaderCell: function(col_node) 
                                col_field = "xyz";
                                this_filter_col = this;
                                  domConstruct.create("div", 
                                      innerhtml: this_filter_col.label,
                                      intermediateChanges: true
                                  , col_node);

                                .
                                var form = new Form(style: "font-size: 11px");
                                .
                                var tc = new TabContainer(
                                style: "height: 220px; width: 300px;",
                                        useMenu    : false,
                                        useSlider  : false,
                                        tabStrip   : false,
                                         tabPosition: "top",
                                         doLayout   : true
                                 );
                                    tc.placeAt(form.domNode);

                                    var cp = new ContentPane(
                                        region: "top",
                                style: "padding: 5px; border-bottom: none;" );
                                .
                                .

                                
                        .
                        .
                        ); 

在上面的代码中,Renderheadcell() 方法为每个标题添加了一个过滤表单(上面的示例“xyz”),当我单击标题中存在的按钮时会弹出一个过滤表单。 一切正常,但是当我对列重新排序时,renderHeaderCell() 块中存在的表单(具有文本框、单选按钮等小部件)会自动重置并再次绘制。 因此,我无法在表单中保留显示我在特定列上应用了哪些过滤器所需的值。

当用户完成列重新排序时,如何防止renderHeaderCell() 调用?

任何解决方案/指针都会有很大帮助。 谢谢,

【问题讨论】:

【参考方案1】:

当列重新排序时,dgrid 会更新网格的结构,从而导致renderHeader 被重新调用,进而导致renderHeaderCell 也被重新调用。

您需要在内部维护小部件的状态并自行恢复它们。如果您使用 Dijit 输入小部件,那么您可能需要考虑使用 dijit/form/Form 而不是直接使用 HTML 表单元素,因为您可以观察 value 的更改并相应地更新状态信息。

不过,我还建议您保留对您在标题单元格中创建的任何小部件的引用,并扩展 _destroyColumns 以确保在重新呈现标题之前正确销毁您创建的任何小部件。

【讨论】:

谢谢肯。请建议任何可扩展的方法来保存和恢复每个 dgrid 列的表单值。因为我们的应用程序中有很多网格,我需要为其维护保存过滤器信息(表单值)。

以上是关于当用户完成列重新排序时如何防止 renderHeaderCell() 调用的主要内容,如果未能解决你的问题,请参考以下文章

如何防止合并重新排序列

如何防止 Mongoose 在修改用户后重新散列用户密码?

当用户点击地址栏输入使用 JQuery 或 JS 时,如何防止网页重新加载

UNION表时如何在Bigquery中重新排列/重新排序嵌套的重复列

同一页面上的两个重新排序列表框,防止用户在之间拖放

jquery-ui-sortable,当列表被隐藏时如何防止取消?