过滤时Sencha EXT JS树检查/取消检查速度非常慢

8tntrjer  于 2022-09-26  发布在  其他
关注(0)|答案(1)|浏览(142)

具有116个节点的树的递归检查/取消检查需要9-13ms,功能:

checkchange: function (record, checked, opts) {
                    var i = 0;
                    var start = new Date();
                    this.suspendLayouts();
                    record.cascadeBy(function (e) {
                        i++;
                        e.set('checked', checked);
                    });
                    this.resumeLayouts();
                    var stop = new Date();
                    alert(i + 'items ' + (stop - start) + 'ms');

                }

但如果存储被其中一个字段过滤,这将变得非常慢(2000毫秒)。这是过滤器:

load: function () {

                    this.getStore().filter({
                        property: 'account_id',
                        value: 3934,
                        operator: '='
                    });

                }

似乎suspendLayouts不工作,每次都在**e上。设置(“选中”,选中);**对所有树进行筛选并重新呈现所有节点。
你可以查一下https://fiddle.sencha.com/#view/editor&fiddle/3l62只需注解/取消注解过滤器代码即可查看差异。有什么办法可以让它更快吗?

798qvoo8

798qvoo81#

找到了在批量更新期间抑制存储事件但在更新完成后需要刷新视图的解决方案。更新之前,必须调用**this.getStore()。暂停事件();**之后:this.getStore().resumeEvents()
和刷新,具体取决于bufferedRenderer:

if (this.getView().bufferedRenderer) {
     this.getView().bufferedRenderer.refreshView();
 } else {
     this.getView().refresh();
 }

完整代码:

checkchange: function (record, checked, opts) {
                    var i = 0;
                    var start = new Date();
                    this.suspendLayouts();
                    this.getStore().suspendEvents();
                    record.cascadeBy(function (e) {
                        i++;
                        e.set('checked', checked);
                    });
                    this.resumeLayouts();
                    this.getStore().resumeEvents();
                    if (this.getView().bufferedRenderer) {
                        this.getView().bufferedRenderer.refreshView();
                    } else {
                        this.getView().refresh();
                    }

                    var stop = new Date();
                    alert(i + 'items ' + (stop - start) + 'ms');

                }

相关问题