extjsGirdPanel.getView()。getRowClass第二次不起作用

时间:2009-05-26 19:49:36

标签: extjs

extjsAction按钮的处理程序使用以下代码调用函数。

  Add: function() {
        var window = Ext.getCmp('wndAdd');
        window.items.items[0].getStore().reload;
        var Grid1 = Ext.getCmp('grdAll');

        var grdStore2 = Ext.getCmp('grid2').getStore();
        var i = 0;
        var IDList = new Array();
        for (i = 0; i < grdStore2.data.length; i++) {

               IDList[i] =
               grdStore2.data.items[i].data['ID'];

        }

        Grid1.getView().getRowClass = function(record, index) {

            if (IDList.contains(record.data["ID"])) {
                return 'disabled-row';
            }
        };

        window.show();

    }
  

但getRowClass函数仅适用于第一次按钮单击。不会禁用添加的行。

4 个答案:

答案 0 :(得分:2)

getRowClass只需要分配一次。它不是您调用的函数,它是每次呈现行时网格内部调用的函数。不应该在事件处理函数内部分配它,而应该在应用程序级别的某个地方分配它(例如,首先配置Grid1本身的地方将是最合理的位置)。这可能是你的问题,也可能不是你的问题,这取决于你的Add函数被调用的方式,这一点尚不清楚。请记住,由于您依赖于getRowClass中的IDList,因此您还必须引用该函数所在范围内的该变量,并且您可能还必须添加检查以确保它在访问之前有效它

您也没有显示Grid1重新渲染的位置。如上所述,getRowClass仅在呈现行时执行,因此除非您在代码中未显示的地方刷新Grid1,否则将永远不会调用getRowClass。

答案 1 :(得分:1)

是的,在配置网格时,只调用一次getRowClass。但我想要的东西会触发每个时候窗口.show()被触发。我在window.onshow事件中使用了以下代码。

for (var i = 0; i < Grid1.getStore().data.length; i++) {
    var element = Ext.get(Grid1.getView().getRow(i));
    var record = Grid1.getStore().getAt(i);
    if (IdList.contains(record.data.ID)) {
        element.addClass('disabled-row')
    } else {
        element.removeClass('disabled-row')
    }
}

答案 2 :(得分:1)

仅供参考,虽然我很高兴您找到了适合您的解决方案,但我不确定您是否了解getRowClass。它不会被调用一次 - 每次重新渲染网格行时(每次数据更改时)都会调用它。它只在您的代码中被调用一次,因为您的代码未正确设置。

我并不完全了解您的用例,但无论窗口显示如何,只要网格的基础数据实际发生变化,行条带化只需要更改。当您正确设置getRowClass函数时,网格会在需要时自动为您调用它,并且它应该“正常工作”。应该不需要编写迭代代码,这只会增加额外的开销。

再次,仅供参考。 :)

答案 3 :(得分:0)

一旦提供了更多信息,我将用适当的答案编辑我的回复。

你什么时候开枪getRowClass?看起来你正在创建这个函数但从来没有真正调用过它。

函数是否出错,完全被调用,或者只是没有做你想做的事情?