1

我需要一种方法来获取 a 中的所有渲染行treepanel,但我无法找到如何实现它。

我尝试了以下事件:

  • treepanel#render:panel.getNodes()是空的,因为行在面板之后呈现。
  • treeview#refresh:它稍后被调用,并view.up('panel').getNodes()成功返回行

但这并没有考虑到后来通过扩展节点添加的行。

  • treeview#cellclick:这几乎可以与 一起工作treeview#refresh,但它不以编程方式解释.expand()节点
  • treepanel#itemexpand: 可以访问展开的节点和行HTMLElement,但我需要的是渲染的子节点

我也试过renderer

xtype: 'treepanel',
columns: {
    xtype: 'treecolumn',
    renderer: function (...)

这是最好的候选,因为它对每个渲染的行只调用一次,但问题是它是在渲染行之前调用的,因此无法从中获取对渲染行的引用。

同样的问题也适用于gridpanel,但情况更加复杂。除其他问题外,我无法找到在bufferedRenderer呈现商店的新页面时触发的事件。

4

1 回答 1

1

我无法使用 ExtJs 的不一致事件找到解决方案。

幸运的是,在 vanilla JS 中,有可能获取插入到 DOM 中的节点:MutationObserver. 这就是我想出的:

Ext.define('Mb.Application', {
    ...
    launch: function() {
        const body = document.getElementsByTagName('body')[0],
            config = { childList: true, subtree: true },
            callback = function(mutationsList) {
                mutationsList.forEach(mutation => {
                    if (mutation.type !== 'childList') return
                    if (!mutation.addedNodes.length) return
                    mutation.addedNodes.forEach(node => {
                        // test if it is a row and do what I need
                    })
                })
            };
        var observer = new MutationObserver(callback.bind(this));
        observer.observe(body, config);

我不知道这可能产生的性能影响。在我的情况下,没有明显的。

我不知道这是否会对某人有所帮助,但以防万一我分享它......

于 2018-04-11T08:28:18.583 回答