Событие onClick кнопки внутри DataGrid

Вот мой DataGrid:

// $ is a reference to `this` as it lies in an anonymous function
$.grid = new DataGrid({
    store : $.dataStore,
    query : {id : "*"},
    structure : [
        { 
            noscroll : true,
            cells : [{ name : "Recipe", field : 'name', width : '200px' }],
        },
        {
            cells : [
                [
                 { name : 'ID#', field : 'id', width : '50px'},
                 { name : 'Category', field : 'category', width : '100px'},
                 { name : 'Status', field : 'status', width : '100px'},
                 { name: "Actions", width : '200px', type: dojox.grid.cells._Widget, formatter : $._actionButtons}
                ]
            ] // end cells
        }
    ]
}, $.targetNode)
$.grid.startup();

$.grid.on("RowClick", function(e){
    console.log(this.getItem(e.rowIndex))
})

И мой объект formatter для ячейки Действия:

_actionButtons : function(){
    var _self = this;
    var _args = arguments;
    this.group = new Pane()

    var full = new Button({ 
        label: 'View Full',
        style : { fontSize : '80%'},
        onClick : function(){
            try {
                _self.grid.onRowClick.apply(this, arguments)
            }catch(e){}
        }
    });
    full._destroyOnRemove = true;

    var edit = new Button({
        label : 'Edit',
        style : {fontSize: '80%'}
    });
    edit._destroyOnRemove = true;

    construct.place(full.domNode, this.group.containerNode)
    construct.place(edit.domNode, this.group.containerNode)

    return this.group;
}

Я пытаюсь получить доступ к объекту события, который будет передан обычным событием onRowClick в DataGrid. Сейчас это работает, но в блоке on("RowClick"...) я получаю несколько журналов. Без блока try...catch я получаю сообщение об ошибке, поскольку rowIndex не существует в e, а затем еще 2 журнала, где он существует.

Это четвертая или около того идея, которую я включил pub/sub, emit() и т. д. У меня есть ощущение, что несколько журналов вызваны всплывающим поведением (Button -> Row -> DataGrid или что-то в этом роде), но получение объект события onRowClick для передачи в кнопки, созданные в средстве форматирования, кажется невозможным.

Я просто хочу получить доступ к rowIndex (и другим свойствам DataGrid-esque) из события onClick виджета Button для обработки в соответствии с нажатой кнопкой.


person Phix    schedule 20.06.2012    source источник


Ответы (1)


В том же духе, но вот то, что я придумал, похоже, работает в направлении, в котором произойдет то, что я предполагаю. Скорректирована ячейка, где будут кнопки:

{ name: "Actions", width : '200px', type: dojox.grid.cells._Widget, formatter : 
    function(){
        return $._actionButtons.call($, arguments);
    }
}

Скорректирована функция onClick в возвращаемом виджете Button:

_actionButtons : function(){
    var _index = arguments[0][1],
        _item  = this.grid.getItem(_index)
        _self  = this;

    // some code removed

    onClick : function(){
        console.log(_self.dataStore.getValue(_item, 'name'), "clicked")
    }
}

Я, вероятно, закончу тем, что расширил Button, чтобы справиться с этим немного лучше, но пока, вуаля!

Иногда полезно просто записать это и выложить, чтобы ваш мозг запаниковал и нашел решение раньше, чем кто-либо другой :)

Незначительное обновление...

Существует параметр formatterScope для DataGrid, но он применяется ко всем formatter и, следовательно, испортит все, что требует области действия ячейки, а не области DataGrid. Вышеупомянутый метод позволяет мне получить доступ ко всему, что мне нужно.

person Phix    schedule 21.06.2012