dojo小部件在销毁时会发出一个事件,还是可以强制一个?

时间:2015-04-28 23:28:44

标签: javascript dojo

我有一个基于_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();

但是父母也没有发现事件。有什么建议?

3 个答案:

答案 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');}