2016-12-17 2 views
1

Не могли бы вы научить меня, как вызывать вложенные методы? Основная идея, я хочу иметь функцию внутри класса, которую я могу настроить извне, отправив другую папкуSelector с другим обратным контуром. Но когда сейчас я пытаюсь сделать это ExtJS говорит мне:Как использовать вложенные методы во вновь создаваемом классе Ext.define

[W] XTemplate evaluation exception: foldersSelector is not a function 

Пример кода:

Ext.define('somepath.Some1', { 
 
extend: 'somepath.SomeParent', 
 
text: 'sometext', 
 
foldersSelector: function(data){ 
 
\t return data.folders; 
 
}, 
 
initComponent: function(){ 
 
    ... 
 
    this.callParent(); 
 
} 
 
renderer: function(data){ 
 
\t bla bla bla/got data from somewhere 
 
\t ... 
 
\t ... 
 
\t foldersSelector(data); 
 
    // with this.foldersSelector result the same! 
 
} 
 
});

+0

родительский класс: «» Ext.grid.column.Column –

ответ

1

У вас не хватает this в вашей функции. Вам нужно вызвать функцию из объекта класса. Что-то вроде этого:

Ext.define('MyApp.view.MyPanel', { 
    extend: 'Ext.panel.Panel', 
    alias: 'widget.mypanel', 


    height: 250, 
    width: 400, 
    title: 'My Panel', 
    defaultListenerScope: true, 


    listeners: { 
     render: 'onPanelRender' 
    }, 

    onPanelRender: function(component, eOpts) { 
     // call using this 
     this.folderSelector(); 
     // call using component 
     component.folderSelector(); 
    }, 

    folderSelector: function(data) { 
     console.log('Function') 
    } 

}); 

Fiddle https://fiddle.sencha.com/#view/editor&fiddle/1mpe


В вашем случае, вы находитесь в столбце сетки, вы не можете назвать this потому что сетка. Вы должны получить столбец.

Ext.define('MyApp.view.MyColumn3', { 
    extend: 'MyApp.view.SuperColumn', 
    alias: 'widget.mycolumn3', 

    id: 'myColumnId', 

    foldersSelector: function (data) { 
     console.log('I AM CALLED'); 
     return data + '-SOSO' 
    }, 

    renderer: function(value, metaData, record, rowIndex, colIndex, store, view) { 
      // you have to get the column, there are many ways how to do so     
      var c = Ext.first('#myColumnId') 
      return c.foldersSelector(value) 
    } 

    // option without the id 
    renderer: function(value, metaData, record, rowIndex, colIndex, store, view) {  
      // this is the grid 
      var gridColumns = this.getColumns(); 
      // we know the column index 
      var c = gridColumns[colIndex]; 
      return c.foldersSelector(value) 
    } 


}); 

Fiddle: https://fiddle.sencha.com/#view/editor&fiddle/1mpo

+0

ваш ответ хорош, и это настоящие произведения для представления компонента, но я забыл сказать, что у меня это ребенок Ext. grid.column.Column, который имеет метод renderer. Должен ли я отметить этот вопрос как разрешенный и спросить анотера один для Ext.grid.column.Column? ( –

+0

@EldarNezametdinov Я обновил ответ с решением для вас – pagep

+0

в случае, если у меня есть много объектов с одним и тем же id extjs, вернется ошибка: дублировать id. 'id: 'myColumnId',' и 'Ext.first ('# myColumnId')' настолько жестко закодированы. любой другой способ получить столбец? Я поставил вопрос как разрешенный, потому что он уже очень полезен для других. Я использовал этот столбец во многих сетках, поэтому у меня не может быть только один идентификатор для многих столбцов с индексом. –