我正在尝试将我的onClick侦听器注册为 dijit Button ,并将其作为单元格小部件放置为 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文档中的代码,所以它应该正常工作。但为什么在这种情况下没有注册?
答案 0 :(得分:2)
我在GridX wiki中找到了答案: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 :(得分:1)
我不知道你使用的dojo版本,但是当你使用data-dojo-type时,我认为它是1.7+。 首先,我建议删除模块名称的点符号并开始使用AMD mid语法(即:删除“dijit.form.Button”为“dijit / form / Button”,因为点符号将在dojo中删除2.0)。
然后,将事件连接到小部件的推荐方法是:
我更喜欢使用第二种形式,因为它与dojo / on更加一致。它包括使用不带“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')
});
}
},
注意:未经测试的代码。我只是猜测问题可能是什么。如果还有问题,请告诉我......
答案 2 :(得分:1)
我发现使用getCellWidgetConnects
效果很好(see docs)。
但是文档并不完全清楚,所以起初它并不适合我。如果要连接到 DomNode ,则传递'click'
作为连接数组中的事件。如果您要连接到Dijit小部件,请传递'onClick'
。