无法在extjs中访问this.myvar

Cannot acces this.myvar in extjs

本文关键字:访问 this myvar extjs      更新时间:2023-09-26

我正在向ExtJs网格动态添加额外的列,因此我将索引存储为类变量。但这似乎确实有效,如下所示。为什么会这样?

for ( var i = 0; i < names.length; i++) {
var column = Ext.create('Ext.grid.column.Column', {
    text : names[i],
    header : names[i],
    width : 80,
    dIndx: i,
    renderer: function (val, p, record) {
        var value = record.data.values[this.dIndx];  // doesn't work
        var value = record.data.values[p.column.dIndx];  // this works
    return value ? value : "";
    }
    });
 // add column to grid etc.

我认为this控制器Ext.grid.Panel的作用域(如果没有另行定义,请参阅编辑),这就是为什么它不能使用关键字工作的原因。无论如何,第二个是更好的解决方案IMO

编辑

正如@kevhender所评论的,可以为渲染器定义一个范围。但当你使用其中一个论点时,这毫无意义。不管怎么说,我没有提到它。

编辑2-为什么默认作用域是Ext.grid.Panel

这是处理渲染的函数的一个片段。该方法是私有的,因此未在API中列出。无论如何,这是源链接。请注意,使用给定的作用域或所有者容器column.renderer.call(column.scope || me.ownerCt,//...的作用域调用渲染器,视图的所有者是它嵌套到其中的面板。

/**
 * @private
 * Emits the HTML representing a single grid cell into the passed output stream (which is an array of strings).
 *
 * @param {Ext.grid.column.Column} column The column definition for which to render a cell.
 * @param {Number} recordIndex The row index (zero based within the {@link #store}) for which to render the cell.
 * @param {Number} columnIndex The column index (zero based) for which to render the cell.
 * @param {String[]} out The output stream into which the HTML strings are appended.
 */
renderCell: function(column, record, recordIndex, columnIndex, out) {
    //... more code
    if (column.renderer && column.renderer.call) {
        value = column.renderer.call(column.scope || me.ownerCt, fieldValue, cellValues, record, recordIndex, columnIndex, me.dataSource, me);
        if (cellValues.css) {
            // This warning attribute is used by the compat layer
            // TODO: remove when compat layer becomes deprecated
            record.cssWarning = true;
            cellValues.tdCls += ' ' + cellValues.css;
            delete cellValues.css;
        }
    }
    // ... more code