0

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

4 回答 4

2

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

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

于 2009-05-27T05:35:18.053 回答
1

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

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

再次,仅供参考。:)

于 2009-06-12T19:55:25.447 回答
1

是的,配置网格时 getRowClass 只被调用一次。但我想要每次window.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')
    }
}
于 2009-06-12T18:42:38.493 回答
0

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

你什么时候触发getRowClass?似乎您正在创建函数,但从未真正调用响应。

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

于 2009-05-27T04:06:06.303 回答