如何在GridX中注册onClick监听器到dijit Button?

时间:2013-07-10 12:28:46

标签: javascript dojo dijit.form dojo.gridx

我正在尝试将我的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文档中的代码,所以它应该正常工作。但为什么在这种情况下没有注册?

3 个答案:

答案 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)。

然后,将事件连接到小部件的推荐方法是:

  • 将事件定义为函数(如widget.onClick = function(evt){...})
  • 或使用小部件的“on”方法(如widget.on(“click”,function(evt){...}))

我更喜欢使用第二种形式,因为它与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'