Extjs如何在扩展时初始化新元素 - 不会丢失范围

时间:2010-06-30 14:27:53

标签: extjs scope extend

我正在努力扩展 Extjs 的类,并且我的演变引导我解决这个问题:

我已经扩展了 Ext.Panel ,我希望我的扩展程序有一个底部工具栏,默认情况下只有一个按钮。

myPanel = Ext.extend(Ext.Panel, {
    method: function () {
        return 'response!';
    },

    bbar: new Ext.Toolbar({
        items:
        [
            {
                xtype: 'button',
                text: 'Hit me!',
                handler: function (button, event) {
                    alert(this.method());
                },
                scope: this
            }
        ]
    })
});

我还没有学到的是为什么不允许这样做。 this指向全局范围而不是我的扩展面板 - 因此.method()在处理函数内是undefined

2 个答案:

答案 0 :(得分:6)

您在原型上定义了bbar,而不是在特定对象上定义。

覆盖initComponent并在其中移动bbar定义。

myPanel = Ext.extend(Ext.Panel, {
    method: function () {
        return 'response!';
    },

    initComponent: function() {    
        var bbar = new Ext.Toolbar({
            items:
            [
                {
                    xtype: 'button',
                    text: 'Hit me!',
                    handler: function (button, event) {
                        alert(this.method());
                    },
                    scope: this
                }
            ]
        });

        // Config object has already been applied to 'this' so properties can 
        // be overriden here or new properties (e.g. items, tools, buttons) 
        // can be added, eg:
        Ext.apply(this, {
            bbar: bbar
        });

        // Call parent (required)
        myPanel.superclass.initComponent.apply(this, arguments);

        // After parent code
        // e.g. install event handlers on rendered component
    }
});

有关扩展组件时可以使用的模板,请参阅http://www.sencha.com/learn/Manual:Component:Extending_Ext_Components

答案 1 :(得分:1)

您必须记住,作为items数组的第一个元素的匿名对象是在与执行Ext.extend(...的范围相同的范围内创建的。

如果你有这个:

var o = { 'a': a, 'b': b, scope: this };

您希望o.ao.bo.scopeabthis具有相同的值目前的范围。在这里,它有点复杂,因为你在创建一个对象时创建一个对象,同时创建一个对象,但推理是相同的。

你应该做的是在构造函数中定义this.bbar

myPanel = Ext.extend(Ext.Panel, {
    method: function () {
        return 'response!';
    },

    constructor: function(config) {
        this.bbar = new Ext.Toolbar({
            items:
            [
                {
                    xtype: 'button',
                    text: 'Hit me!',
                    handler: function (button, event) {
                        alert(this.method());
                    },
                    scope: this
                }
            ]
        });

        myPanel.superclass.constructor.apply(this, arguments);
    }
});