我有一个基于_WidgetBase的自定义小部件。我用JavaScript创建它,想知道它何时被销毁。
父母代码:
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
我已尝试附加卸载,销毁和删除 - 这些事件都没有被触发。当点击一个按钮时,小部件实际上会自行销毁,所以我试图强制它发出一个事件,就像这样(在小部件中):
on.emit(this,"destroy");
this.destroyRecursive();
但是父母也没有发现事件。有什么建议?
答案 0 :(得分:2)
dojo/aspect.after
是一个很好的解决方案,你想在调用某个方法时做某事,但没有事件要听。
示例:
aspect.after(editRelatedTableWidget, 'destroy', function () {
console.log(this.id + ' destroyed');
}, true);
回调后的true
参数是receiveArguments
标志,它告诉aspect.after
将原始参数原样发送给回调,更重要的是,忽略其返回值,保留原始函数的返回值。如果此标志为false
,则回调将传递原始返回值和参数数组,并且必须显式返回函数现在应返回的值。
答案 1 :(得分:1)
我发现为了从dojo小部件发出自定义事件,小部件需要继承Evented(dojo / Evented)。 e.g。
declare ([_WidgetBase, Evented], {
_done: function () {
on.emit(this, "done");
}
调用代码现在可以监听完成的事件,例如
on(editRelatedTableWidget, "done", function () {console.log("it's done");})
答案 2 :(得分:-2)
我们可以使用小部件的uninitialize功能。当窗口小部件被销毁时,将调用此函数。 例如:
editRelatedTableWidget.uninitialize = function(){ console.log('destroyed');}