1

我正在使用 EXTJS 4 数据视图,并且在将侦听器添加到每个数据节点中的 html 元素(链接)时结果不一致。我已将代码放在与数据视图相关的商店的负载侦听器中。它似乎在第一次加载时工作,但随后的加载变得更糟,因为它开始丢失一些元素。每次调用 store.reload() 都会变得更糟。

我已经在 firebug 中验证了 html 元素 ID 正在正确呈现,但是由于某种原因,当我重新加载商店时,它首先开始丢失一些元素,然后是所有元素。下面的负载监听器代码:

listeners: {
            load: function(store, records, successful, options){
                    var nodes = records;
                    for (i=0, len = nodes.length; i < len;i++){
                        var id = nodes[i].data.id;
                        var addtocartel = Ext.get('img-cart-'+id);
                        var viewel = Ext.get('img-view-'+id);
                        //Setting hidden class for nonimage items
                        switch (nodes[i].data.type) {

                            case 'image' :
                            viewel.addCls('imgprf');
                            addtocartel.addCls('cartprf');
                            break;

                            default :
                            viewel.addCls('sc_hidden');
                            addtocartel.addCls('sc_hidden');
                            viewel.hide();
                            addtocartel.hide();
                            break;
                        }

                        if(addtocartel !== null){
                            addtocartel.itemid = id;
                            addtocartel.on('click', function(e,t){
                              var el = Ext.get(t);
                              var imgrec = imagestore.getById(el.itemid);
                              e.stopEvent(); 
                              prfproductwindow.show();
                            });
                        }
                        if(viewel !== null){
                            viewel.itemid = id;
                            viewel.on('click', function(e,t){
                                var el = Ext.get(t);
                                var imgrec = imagestore.getById(el.itemid);
                            });
                        }
                    }
            }
        }
4

1 回答 1

0

可以在不发生任何类型的负载的情况下刷新网格视图。当网格视图刷新时,它会清除现有的 html 元素并创建新元素,因此您附加到这些元素的任何侦听器都将毫无用处。

您应该考虑向整个网格添加点击监听器,并使用委托来监听视图中特定 html 元素的点击。这将允许您添加一个侦听器,无论视图中的元素被重新渲染多少次,该侦听器都将始终有效。

grid.getView().getEl().on('click', function(evt, target) {
    console.log('clicked on ' + target);
}, {delegate: '.my-css-selector-for-some-element'});

只有点击与委托选择器匹配的元素才会触发点击处理程序。

此外,您根据记录类型添加 css 类的逻辑应该在渲染器中完成(如果您有网格)或由数据视图的模板处理。

于 2013-07-02T04:17:41.377 回答