extjs изменить заголовок панели на мероприятии

У меня есть панель сетки, как это

Ext.define('sCon.view.SalesGrid',{
        extend: 'Ext.grid.GridPanel',
        title: 'Sales Data',

        //other params   

        initComponent: function(){
            this.callParent(arguments);
        }
    });

В событии щелчка я хочу изменить заголовок этой панели. Мой код внутри контроллера выглядит так.

Ext.define('sCon.controller.SalesGridController', {
        extend: 'Ext.app.Controller',
        views: ['SalesGrid'],

        // other handlers

        changeTitle: function(newTitle){
            this.getView('SalesGrid').setTitle('title_changed');
        }

В настоящее время он говорит, что у него нет такой функции, как setTitle(). Но в документах говорится, что панель сетки имеет функцию setTitle(). Я также попытался изменить заголовок, используя переменную title, например

 changeTitle: function(newTitle){
            this.getView('SalesGrid').title = 'title_changed';

Ни то, ни другое не работает. Пожалуйста, помогите.


person amrk7    schedule 03.09.2012    source источник
comment
Ваша ошибка означает, что что-то было возвращено методом this.getView('SalesGrid') не имеет .setTitle(). Похоже, у вас нет представления "SalesGrid" от this.getView('SalesGrid').   -  person s.webbandit    schedule 03.09.2012
comment
да забыл упомянуть об этом. когда я записываю console.log(this.getView('SalesGrid')), я получаю что-то вроде этого - functionstructor() { return this.constructor.apply(this, arguments) || нулевой; } , Когда я регистрируюсь - this.getView('SalesGrid'), я получаю неопределенность..   -  person amrk7    schedule 03.09.2012
comment
this.query('SalesGrid')[0] или this.getComponent(0) вместо this.getView('SalesGrid') даст вам сетку продаж... или @webbandit, его решение еще лучше с использованием контроллера...   -  person VDP    schedule 03.09.2012


Ответы (2)


UPD: здесь несколько refs документов из Сенча для ExtJS 4.1.

Используйте свойство refs вашего контроллера, чтобы получить ссылки на любые компоненты.

В вашем примере:

Ext.define('sCon.view.SalesGrid',{
  extend: 'Ext.grid.GridPanel',
  title: 'Sales Data',

  alias: 'widget.salesgrid',

  //other params   

  initComponent: function(){
    this.callParent(arguments);
  }
});

В контроллере добавить:

refs: [
  { ref: 'salesGrid', selector: 'salesgrid', },
]

Затем вы можете получить доступ к представлению SalesGrid из любого места вашего контроллера, например, с помощью метода this.getSalesGrid();.

В твоем случае:

changeTitle: function(newTitle){
  this.getSalesGrid().setTitle('title_changed');
}
person s.webbandit    schedule 03.09.2012
comment
Спасибо! работает... думал, что просмотры: ['SalesGrid'], сам бы сослался на мой salesGrid. - person amrk7; 03.09.2012
comment
@webbandit, вы должны больше объяснить о ссылках или хотя бы предоставить ссылки на API. - person sra; 03.09.2012
comment
@webbandit Это свойство появилось с версии 4.1. - person sra; 03.09.2012
comment
Да, это. Потратьте некоторое время, чтобы перейти на 4.1. От версии к версии ExtJS становится все лучше и лучше. - person s.webbandit; 03.09.2012

Примечание

В описанном случае ответ веб-бандита является лучшим для доступа к экземпляру представления, этот остается для разъяснения использования автоматически сгенерированных геттеров.

Метод селектора, который вы используете, просто дает вам класс, а не его экземпляр!

Вы должны сделать это так

this.getView('SalesGrid').create().setTitle('title_changed');

См. API

person sra    schedule 03.09.2012
comment
Кажется, это не работает. Даже если это так, предпочел бы я использовать один и тот же экземпляр объекта вместо создания нового объекта для каждого события? (Я действительно не знаю .. Я новичок в extjs) - person amrk7; 03.09.2012
comment
@amruthkesav так используется в документах. Смотрите обновленный пост. И вы не можете сказать это для всех случаев... В некоторых случаях я использую один и тот же экземпляр представления, в других я создаю каждый новый. Это зависит от вида представления и того, что вы делаете. В общем, вы должны использовать смесь - person sra; 03.09.2012