0

这是我在网格内组合框的代码:

{
    header: 'FSCS',
    dataIndex: 'acntOvrrideTypeCd',
    flex: 1,
    renderer: function(val, metaData, record, rowIndex, colIndex) {
        var id = Ext.id();
        var store = new Ext.data.Store({
            fields: ['code', 'description'],
            data: [{
                "code": "",
                "description": ""
            }, {
                "code": "E",
                "description": "E"
            }, {
                "code": "D",
                "description": "D"
            }, {
                "code": "S",
                "description": "S"
            }]
        });

        Ext.Function.defer(
            (function() {
                var cb = Ext.create('Ext.form.ComboBox', {
                    id: 'acntOvrrideTypeCd-' + rowIndex,
                    queryMode: 'local',
                    renderTo: id,
                    store: store,
                    forceSelection: true,
                    triggerAction: 'all',
                    lazyRender: true,
                    size: 5,
                    valueField: 'code',
                    displayField: 'description',
                    value: val
                    //listeners:{
                    //    scope: this,
                    //    'select': Ext.getCmp('amlFscsForm').controller.amlShow(rowIndex)
                    //}

                });
                cb.on(afterrender, function() {
                    console.log("------- box---" + rowIndex);
                    Ext.getCmp('amlFscsForm').controller.amlShow(rowIndex);
                });
            }), 0.25);

        console.log("i----------" + id);
        return (Ext.String.format('<div id="{0}"></div>', id));
    }
}

'afterrender' 事件不会被触发。我需要在渲染后启用或禁用组件。

任何人都可以帮忙吗?

4

2 回答 2

0

这只是一个错字,afterrender 应该用引号引起来,否则您只需添加未定义事件的函数。

cb.on('afterrender',function(){
     console.log("------- box---" + rowIndex);
     Ext.getCmp('amlFscsForm').controller.amlShow(rowIndex);
});
于 2012-08-22T12:34:46.853 回答
0

您的代码存在一些问题。

  1. 看起来您正试图在网格的渲染器函数中创建一个组合框(您在顶部的代码没有包含在代码块中)。您最好改用Ext.grid.plugin.CellEditing插件,它将按需创建一个字段,而不是在列呈现时创建。此外,每次刷新网格视图时,您都会为网格中的每一行创建另一个存储和组合框。不利于性能,也不利于用户体验。

  2. 调用 defer 时,持续时间以毫秒为单位,而不是秒。此外,您不需要将函数括在括号中。只需给它功能本身。像这样:

    Ext.defer(function(){
        // do stuff
    }, 25);
    
  3. 将lazyRender 设置为true 仅在您的组件是某个不会立即呈现其所有组件的容器的子组件(如选项卡面板)时才有效。

  4. 除非您在创建时没有可用的信息,否则在创建它而不是渲染它时在组合框中设置禁用的配置可能更容易。

  5. 就像 nscrob 说的,在使用on方法时需要将事件指定为字符串。如果您使用 listeners 配置(您已将其注释掉),您可以这样做:

    listeners: {
        afterrender: function(){
            console.log("------- box---" + rowIndex);
            Ext.getCmp('amlFscsForm').controller.amlShow(rowIndex);
        },
        select: function(){
            Ext.getCmp('amlFscsForm').controller.amlShow(rowIndex);
        }
    }
    

    请务必注意,这些侦听器函数的范围默认为组件本身(您的组合框),因此scope: this没有必要。除非您希望范围是创建此组合框的任何对象,否则就是这样。

第一点是最重要的。考虑使用 CellEditing(或 RowEditing)插件,我保证事情会顺利得多。

于 2012-08-22T12:55:09.547 回答