dojo 小部件在被销毁时会发出事件还是您可以强制发出事件?

Do dojo widgets emit an event when destroyed or can you force one to?

我有一个基于 _WidgetBase 的自定义小部件。我在 JavaScript 中创建它并想知道它何时被销毁。

parent 中的代码:

var editRelatedTableWidget = new EditRelatedTable().placeAt(dom.byId("docEditorWidget");
editRelatedTableWidget.startup();
on(editRelatedTableWidget, "click", function () {console.log("DIJIT CLICKED"); }); // works
on(editRelatedTableWidget, "destroy", function () { console.log("DIJIT DESTROYED"); }); // does not ever happen

我尝试附加卸载、销毁和删除 - none 这些事件被触发。单击按钮时,小部件实际上会自行销毁,因此我尝试强制它发出一个事件,如下所示(在小部件中):

on.emit(this,"destroy");
this.destroyRecursive();

但是 parent 也没有检测到事件。有什么建议么?

我们可以使用widget的uninitialize函数。当小部件将被销毁时,将调用此函数。 例如:

 editRelatedTableWidget.uninitialize = function(){ console.log('destroyed');}

我发现为了从 dojo 小部件发出自定义事件,小部件需要继承 Evented (dojo/Evented)。例如

declare ([_WidgetBase, Evented], {
  _done: function () {
  on.emit(this, "done");
}

调用代码现在可以侦听完成事件,例如

on(editRelatedTableWidget, "done", function () {console.log("it's done");})

dojo/aspect.after 对于这样的情况是一个很好的解决方案,当某个方法被调用时你想做一些事情,但是没有事件可以监听。

示例:

aspect.after(editRelatedTableWidget, 'destroy', function () {
    console.log(this.id + ' destroyed');
}, true);

回调后的 true 参数是 receiveArguments 标志,它告诉 aspect.after 将原始参数按原样发送给回调,更重要的是,忽略它的 return 值,保留原始函数的 return 值。如果此标志为 false,则向回调传递原始 return 值和参数数组,并且必须显式 return 函数现在应 return 的值。