2016-12-17 3 views
1

Können Sie mir beibringen, wie verschachtelte Methoden aufgerufen werden? Grundlegende Idee, ich möchte eine Funktion innerhalb einer Klasse haben, die ich von draußen konfigurieren kann, indem ich einen anderen OrdnerSelector mit anderem Rückkehrweg sende. Aber wenn jetzt versuche ich, dass extjs zu tun, sagt zu mir:Wie verschachtelte Methoden in der neu erstellten Klasse zu verwenden sind Ext.define

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

Code-Beispiel:

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

Elternklasse: ‚Ext.grid.column.Column‘ –

Antwort

1

Sie fehlen this in Ihrer Funktion. Sie müssen die Funktion vom Klassenobjekt aufrufen. Etwas wie folgt aus:

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


In Ihrem Fall sind Sie in der Rasterspalte, können Sie nicht this nennen, weil, dass das Gitter ist. Du musst die Spalte bekommen.

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

Ihre Antwort ist gut und es wirklich funktioniert für View-Komponente, aber ich habe vergessen zu sagen, dass mein Kind von Extern ist. grid.column.Column, das über eine Renderer-Methode verfügt. Sollte ich diese Frage als gelöst markieren und anoter für Ext.Grid.Column.Column fragen? ( –

+0

@EldarNezametdinov Ich habe die Antwort mit der Lösung für Sie aktualisiert – pagep

+0

für den Fall, wenn ich viele Objekte mit der gleichen ID haben extjs wird zurückkehren ein Fehler: doppelte ID. 'ID: 'myColumnId',' und 'Ext.first ('# myColumnId')' sind so hart codiert .. jede andere Möglichkeit, Spalte zu bekommen? Ich markierte Frage als gelöst, weil es schon sehr ist nützlich für andere. Ich habe diese Spalte in vielen Rastern verwendet, so kann ich nicht nur eine ID für viele instanziierte Spalten haben .. –

Verwandte Themen