Как зарегистрировать прослушиватель onClick для кнопки dijit в GridX?

Я пытаюсь зарегистрировать свой прослушиватель onClick на кнопку dijit, размещенную как виджет в ячейке с помощью GridX. Я сделал следующее, основываясь на примере test_grid_cellWidget:

{ field: "save", name:"Save", 
    widgetsInCell: true,
    navigable: true,
    decorator: function(){
        //Generate cell widget template string
        return '<button data-dojo-type="dijit.form.Button" data-dojo-attach-point="btn">Save</button>'
    },
    setCellValue: function(data){
        //"this" is the cell widget
        this.btn.set("label", "Speichern")
        this.btn.connect("onClick", function(){
            alert('clicked')
        })
    }
},

setCellValue выполняется успешно, и метка изменена. Однако прослушиватель onClick не зарегистрирован и не вызывается, когда я нажимаю кнопку. Когда я использую синтаксис data-dojo-props="onClick:function", он работает, но требует объявления функции слушателя как глобальной, чего я хотел бы избежать.

Во всяком случае, у меня есть объект Button, и я выполняю код, найденный в документах dijit, поэтому он должен работать. Но почему ничего не прописано в этом контексте?


person Danubian Sailor    schedule 10.07.2013    source источник


Ответы (3)


Я нашел ответ в вики GridX: https://github.com/oria/gridx/wiki/How-to-show-widgets-in-gridx-cells%3F

Вам нужно использовать поле cellWidget.btn._cnnt:

    setCellValue: function(gridData, storeData, cellWidget){
        this.btn.set("label", "Speichern")
        if(cellWidget.btn._cnnt){
            // Remove previously connected events to avoid memory leak.
            cellWidget.btn._cnnt.remove();
        }
        cellWidget.btn._cnnt = dojo.connect(cellWidget.btn, 'onClick', lang.hitch(cellWidget.cell, function(){
            rowSaveClick(this.row)
        }));
    },
person Danubian Sailor    schedule 10.07.2013

Я не знаю, какую версию додзё вы используете, но, поскольку вы используете тип данных додзё, я полагаю, что это 1.7+. Во-первых, я бы порекомендовал отказаться от точечной нотации имен модулей и вместо этого начать использовать синтаксис AMD mid (т.е. вместо «dijit/form/Button» вместо «dijit/form/Button» вместо «dijit/form/Button» отбросить точечную нотацию 2.0).

Затем рекомендуемый способ подключения событий к виджетам:

  • либо определить событие как функцию (например, widget.onClick = function(evt){...})
  • или используйте метод "on" виджета (например, widget.on("click", function(evt){...}))

Я предпочитаю использовать вторую форму, так как она более совместима с додзё/он. Он состоит в использовании имени события без «включено» и написании всего строчными буквами. Например, если у вашего виджета есть точка расширения с именем «onMouseRightClick», вы можете использовать ее как widget.on("mouserightclick", ...)

Тогда ваш пример станет:

{ field: "save", name:"Save", 
    widgetsInCell: true,
    navigable: true,
    decorator: function(){
        //Generate cell widget template string
        return '<button data-dojo-type="dijit/form/Button" data-dojo-attach-point="btn">Save</button>'
    },
    setCellValue: function(data){
        //"this" is the cell widget
        this.btn.set("label", "Speichern")
        this.btn.on("click", function(){
            alert('clicked')
        });
    }
},

Примечание: непроверенный код. Я просто предполагаю, в чем может быть проблема. Дайте мне знать, если проблема все еще существует...

person Philippe    schedule 10.07.2013
comment
Нет, это должно работать, но GridX что-то меняет в виджетах, смотрите мой ответ, я наконец-то нашел это. on() было моим первым предположением. Возможно, он заблокирован из-за потенциальной утечки памяти при отображении и уничтожении элементов управления сеткой (например, при разбиении на страницы) - person Danubian Sailor; 10.07.2013
comment
Понятно... кажется, что в версии 1.2 есть более новый подход, использующий метод getCellWidgetConnects, упомянутый в вашей ссылке чуть ниже примера, который вы взяли. - person Philippe; 10.07.2013

Я обнаружил, что использование getCellWidgetConnects работает достаточно хорошо (см. документы).

Но документы не совсем ясны, поэтому сначала у меня это не сработало. Если вы подключаетесь к DomNode, передайте 'click' как событие в массиве соединений. Если вы подключаетесь к виджету Dijit, передайте 'onClick'.

person Javier Pedemonte    schedule 27.06.2014