1

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

4

3 回答 3

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)
        }));
    },
于 2013-07-10T14:54:08.413 回答
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')
        });
    }
},

注意:未经测试的代码。我只是猜测可能是什么问题。如果还有问题,请告诉我...

于 2013-07-10T14:41:52.940 回答
1

我发现 usinggetCellWidgetConnects效果很好(请参阅文档)。

但是文档并不完全清楚,所以起初它对我不起作用。如果您要连接到DomNode,则传递'click'作为连接数组中的事件。如果您要连接到 Dijit 小部件,则通过'onClick'.

于 2014-06-27T15:56:55.667 回答