从 extjs 网格中获取选定记录的正确方法

proper method to get selected record from extjs grid

我需要从 extjs 网格中获取选定的记录,但是

Uncaught TypeError: grid.getSelectionModel is not a function

得到这个观点

Ext.define( 'App.view.Measuries', {
extend: 'Ext.window.Window',
alias : 'widget.measuries',
title: 'Мероприятия',

autoShow: false,
modal: true,
resizable: true,

initComponent: function()
{
    this.items = [
            {
        
            xtype: 'grid',
            alias: 'measuries_grid',
            bodyPadding: 8,
            defaults: { width: 1000, labelAlign: 'top' },
            
            columns:[
                { header: 'п/п',             width: 60, dataIndex: 'm_number',     menuDisabled: true, sortable: false},
                { header: 'Мероприятие',             width: 340, dataIndex: 'm_text',     menuDisabled: true, sortable: false},
                { header: 'Плановая дата выполнения', width: 146, dataIndex: 'date_plan', menuDisabled: true, sortable: false, xtype: 'datecolumn', format:'d.m.Y', align: 'center'},
                { header: 'Фактическая дата выполнения', width: 146, dataIndex: 'date_done', menuDisabled: true, sortable: false, xtype: 'datecolumn', format:'d.m.Y', align: 'center'},
                { header: 'Выполнено', width: 95, dataIndex: 'isdone', menuDisabled: true, sortable: false, align: 'center',
                                                                                                                renderer: function ( v )
                                                                                                                {
                                                                                                                    return '<img src="img/' + v.toString().toLowerCase() + '.png">';
                                                                                                                }},
                { header: 'Отказ',             width: 95, dataIndex: 'faultid',     menuDisabled: true, sortable: false}, 
                    ],
                
            store : 'Measuries'
            
            }   
        ];

和这个控制器(它的一部分)

editMeasuries: function()
{
    var grid = this.getMeasuries();
    console.log(grid);
    var rec  = grid.getSelectionModel().getLastSelected();
    /*var sel = grid.getSelectionModel();
    var rec = sel.getLastSelected();*/
    if ( rec )
    {
        var view = Ext.widget( 'measuries-edit' );
        view.down( 'form' ).loadRecord( rec );
    }
},

“this.getMeasuries()”部分似乎有问题。我的“别名:'widget.measuries'”转到 'Ext.window.Window' 并且 getSelecionModel() 需要一个网格。我试图在 'Ext.window.Window' 中为网格项目设置别名,但也出现了错误。 我如何更改我的控制器部分以使事情正确? 对于可能的错误,我很抱歉,我的英语很弱,所以 extjs。

为网格设置一个 itemId 并在你的 window 上使用 getComponent 得到你的网格:

this.items = [
    {
        itemId: 'myGrid', // add this line
        xtype: 'grid',
...

然后在你的“editMeasures”函数中这样做:

editMeasuries: function()
{
    var myWindow = this.getMeasuries();
    var myGrid = myWindow.getComponent('myGrid');
...

您可能想使用 references 而不是 itemId,这是处理 viewController.

中项目的更快方法

(我正在从@Peter Koltai 获取代码)

this.items = [{
    reference: 'myGrid', // add this line
    xtype:     'grid',
    ...

然后在你的“editMeasures”函数中这样做(你不需要 myWindow,它只是用来演示不同的方法):

editMeasuries: function()
{
    let myWindow = this.getView(),
        myGrid   = this.lookup('myGrid');
    ...