6

選択した行を取得しようとすると、次のエラーが発生します。

Uncaught TypeError: Object #<HTMLDivElement> has no method 'getView'

ビュー、つまりSelectionModelを取得できない場合、現在選択されている行を取得するにはどうすればよいですか?

私のビューコード:

Ext.define('MyLodge.view.content.MemberGrid', {
extend: 'Ext.grid.Panel',
alias: 'widget.membergrid',



initComponent: function(){

    var rowEditing = Ext.create('Ext.grid.plugin.RowEditing');

    var store = Ext.create('MyLodge.store.Members');

    Ext.apply(this, {
        height: this.height,
        plugins: [rowEditing],
        store: store,
        stripeRows: true,
        columnLines: true,
        columns: [{
            id       :'id',
            text: 'ID',
            width: 40,
            sortable: true,
            dataIndex: 'id'
        },{
            text   : 'Name',
            flex: 1,
            sortable : true,
            dataIndex: 'name',
            field: {
                xtype: 'textfield'
            }
        },{
            text   : 'E-Mail',
            width    : 150,
            sortable : true,
            dataIndex: 'email',
            field: {
                xtype: 'textfield'
            }
        },{
            text   : 'Href',
            width    : 200,
            editable: false,
            sortable : true,
            dataIndex: 'href'
        }],
        dockedItems: [{
            xtype: 'toolbar',
            items: [{
                text: 'Add',
                iconCls: 'icon-add',
                handler: function(){
                    // empty record
                    store.insert(0, new MyLodge.model.Member());
                    rowEditing.startEdit(0, 0);
                }
            }, {
                text: 'Delete',
                iconCls: 'icon-delete',
                handler: function(){
                    var selection = grid.getView().getSelectionModel().getSelection()[0];
                    if (selection) {
                        store.remove(selection);
                    }
                }
            },'-',{
                text: 'Save',
                iconCls: 'icon-save',
                handler: function(){
                    store.sync({
                        success: function(response){
                            store.load()
                        }
                    });

                }
            },{
                text: 'Refresh',
                handler: function(){
                    store.load();
                }
            }]
        }]
    });

    this.callParent(arguments);
    }
});
4

2 に答える 2

9

1つのオプションはscope、クロージャーに変数としてを追加することです。

initComponent: function () {
    var me = this;
    .
    .

meしたがって、ハンドラーでグリッドを参照するために使用できます。

{
    text: 'Delete',
    iconCls: 'icon - delete ',
    handler: function () {
        var selection = me.getView().getSelectionModel().getSelection()[0];
        if (selection) {
            store.remove(selection);
        }
    }
}

実例: http: //jsfiddle.net/Sn4fC/


2番目のオプションは、のclick listener代わりにを設定し、 :handlerを指定することです。scope

{
    text: 'Delete',
    iconCls: 'icon - delete ',
    listeners: {
        click: {
            scope: this,
            fn: function () {
                var selection = this.getView().getSelectionModel().getSelection()[0];
                if (selection) {
                    store.remove(selection);
                }
            }
        }
    }
}

実例: http: //jsfiddle.net/XyBbF/

于 2013-03-16T21:13:27.857 に答える
1

問題は、「グリッド」がハンドラー関数スコープで使用できないか、実際に期待したものではないことです。

handler: function(){
      //.... keep the debug point here in browser developer tool and verify the value of grid in console. It is definitely not an instance of the grid u expected hence it wont have getView() method.
      var selection = grid.getView().getSelectionModel().getSelection()[0];

}

グリッドの参照を取得して、以下に示すようにハンドラーで使用してみてください。

Ext.define('MyLodge.view.content.MemberGrid', {
  extend: 'Ext.grid.Panel',
  alias: 'widget.membergrid',
  id: 'membergrid',
  ......

handler: function(){
   var grid = Ext.getCmp('membergrid'); // where 'membergrid' is the id defined in grid config
   var selection = grid.getView()......
于 2013-03-16T20:03:45.207 に答える