Dojo:如何在自定义小部件上正确发出 'change'

Dojo: how to emit 'change' properly on custom widget

所以,假设有一个原生 dijit/form/Select 元素的侦听器,它侦听 change 事件:

nativeSelectWidget.on('change', lang.hitch(this, onSelectClick));

现在,我创建了自己的类似于 Select 的自定义小部件,并尝试使用相同的代码收听:

mySelectWidget.on('change', lang.hitch(this, onSelectClick));

onSelectClick 看起来像:

_onTypeChange: function(value) {
  console.debug('The value is, value)
}

问题是在第二种情况下 onSelectClick 没有收到任何值 (undefined)。

尝试添加:

on.emit(this.domNode, 'change', {
  bubbles: true,
  cancelable: true
});

小部件的 _setValueAttr,试图将其删除。没有传递任何值.. 检查原生 Select 是如何定义的 - https://github.com/dojo/dijit/blob/master/form/Select.js

有什么建议吗?

对于你想要使用它的方式,你应该这样做(在你的自定义小部件中):

1) 继承自 dojo/Evented
2) 添加以下内容:

_setValueAttr: function(value) {
    this._set('value', value);
    this.emit('change', value);
}

这应该可以解决问题

但是,此实现有一个缺点: 如果您更改另一段代码的值,发射仍将被发送,通常我们只希望发射用于用户事件,而不是用于编程更改。