обхват на бутона extjs

Опитвам се да разбера обхвата в сценария по-долу. Когато извиквате searchTerms, this под scope:this се отнася за функцията searchTerms, а не до самия панел. Изглежда, че е различно от това, което наблюдавам от други примери. Мога ли да знам какви грешки направих?

function searchTerms(){
       var searchGrid = new Ext.grid.GridPanel({

        });

        var searchPanel = new Ext.form.FormPanel({
            region: 'south',
            height:150,
            items:[
            {
                xtype: 'textfield',
                fieldLabel: 'Keywords',
            },{
                xtype: 'textfield',
                fieldLabel: 'Label',
            },{
                xtype: 'datefield',
                fieldLabel: 'Valid till'
            },new Ext.Button({
                text: 'crawl',
                scope: this,
                handler: function(b,e){
                    Ext.Ajax.request({^M
                        url: '/discovery/tsearch',^M
                        params: {^M
                            keywords: this.items[0].getValue(),
                            label: this.items[1].getValue(),
                            valid: this.items[2].getValue(),
                        },
                    });
                }
            }),],
        });

        var regionPanel = new Ext.Panel({
            title: 'search',
            layout: 'border',
            items: [searchPanel, searchGrid]
        });

    return regionPanel;
}

person goh    schedule 21.12.2011    source източник


Отговори (1)


Мисля, че искахте да направите това:

function searchTerms(){
   var searchGrid = new Ext.grid.GridPanel({

    });

    var searchPanel = new Ext.form.FormPanel({
        region: 'south',
        height:150,
        items:[
        {
            xtype: 'textfield',
            fieldLabel: 'Keywords',
        },{
            xtype: 'textfield',
            fieldLabel: 'Label',
        },{
            xtype: 'datefield',
            fieldLabel: 'Valid till'
        }],
    });
    searchPanel.add(new Ext.Button({
            text: 'crawl',
            scope: searchPanel,
            handler: function(b,e){
                Ext.Ajax.request({
                    url: '/discovery/tsearch',
                    params: {
                        keywords: this.items[0].getValue(),
                        label: this.items[1].getValue(),
                        valid: this.items[2].getValue(),
                    },
                });
            }
        })
    );
    var regionPanel = new Ext.Panel({
        title: 'search',
        layout: 'border',
        items: [searchPanel, searchGrid]
    });

return regionPanel;
}
person RageZ    schedule 21.12.2011
comment
Това е проблем с обхвата, 'this' ще бъде обектът searchTerm, когато създавате бутона, а не searchPanel, трябва да помислите за резултата, когато кодът ще бъде изпълнен за първи път, а не когато дойде събитието - person RageZ; 21.12.2011
comment
Разликата е, че бутонът е добавен към searchPanel и обхватът е зададен на searchPanel. За да можете да зададете обхвата на searchPanel, searchPanel трябва първо да бъде дефиниран - което не е възможно, когато създадете бутона inline в searchPanel. Това има ли смисъл? - person Chau; 21.12.2011
comment
@Chau: да, има идеален смисъл, затова трябваше да използвам add, ако искате да го направите вградено, мисля, че трябва да получите справката на searchPanel, като използвате parentContainer или използвате някакъв id и getCmp - person RageZ; 21.12.2011
comment
@RageZ: Коментарът не беше предназначен за вас :) Никога не съм мислил да използвам референтна функция като getCmp, но може наистина да работи. - person Chau; 21.12.2011
comment
хм @RageZ Малко съм объркан отчасти поради тази статия. sencha.com/learn/legacy/ И така, позволете ми да изясня, 'this' за примера за връзка се определя само когато се извика функцията на обекта, следователно и самия обект. Докато в моя случай „това“ се определя по време на създаването на обекта, следователно се отнася до обекта searchTerm.... - person goh; 21.12.2011
comment
Ако някога използвате getCmp, вие организирате своето ExtJS приложение абсолютно 1000% ГРЕШНО - person Dexygen; 21.12.2011