2013-07-10 2 views
1

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

{ 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, поэтому он должен работать. Но почему в этом контексте ничего не зарегистрировано?

ответ

2

Я нашел ответ в 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) 
     })); 
    }, 
1

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

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

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

Я предпочитаю использовать вторую форму, поскольку она более соответствует додзе /на. Он состоит из использования имени события без «on» и помещает все в нижнем регистре. Например, если ваш виджет был точкой расширения имени «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') 
     }); 
    } 
}, 

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

+0

Нет, он должен работать, но GridX меняет что-то в виджетах, см. Мой ответ, я наконец нашел его. on() была моей первой догадкой. Возможно, он заблокирован из-за потенциальной утечки памяти, когда элементы управления сетью визуализируются и уничтожаются (например, при разбивке на страницы). –

+0

. Я вижу ..., похоже, в 1.2 есть более новый подход, хотя, используя метод getCellWidgetConnects, упомянутый в вашей ссылке чуть ниже пример, который вы взяли. – Philippe

+0

Я не мог заставить getCellWidgetConnects работать :( –

1

Я нашел что использование getCellWidgetConnects работает достаточно хорошо (see docs).

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