2013-11-27 99 views
1

我有一個自定義dojo小部件,我需要偵聽另一個第三方小部件上的事件,然後將該事件對象發送到另一個自定義小部件。出於某種原因,我的自定義小部件沒有發佈該事件,或者該事件未使用我的第二個自定義小部件正確註冊。dojo小部件不會發出事件

這裏是我的第一個自定義插件的事件相關的代碼:

onSelectComplete : function(evt) { 
    // this custom widget inherits from dojo/Evented. I've tried using this.emit and I've tried inheriting from _WidgetBase 
    on.emit(self, "select", evt); 
}, 

startDrawing : function() { 

    //self._drawToolbar is the 3rd party widget from an API 
    self._drawToolbar.activate(Draw.POLYGON); 

    self._drawEndHandle = self._drawToolbar.on("draw-end", self.onSelectComplete); 

}, 

這裏是我的第二個自定義插件的監聽器:

on(self._selector, "select", function(evt) { 
    console.log(evt); 
}); 

對於聽者,我已經試過聽對於onSelectComplete,selectComplete,SelectComplete,selectcomplete,select-complete並且都沒有工作。我也嘗試使用aspect.after而不是on,但這也沒有奏效。我能夠在調試時確定第一個自定義小部件的onSelectComplete被正確調用。

我卡住了...

+0

雖然猜測函數是自定義窗口小部件聲明的一部分,但使用'self'表示法是錯誤的。當您的瀏覽器到達代碼時,您的(全局?)變量'self'可能未定義或初始化爲指向另一個對象。 I.e ..轉換爲'this' :) – mschr

+0

@mschr - 在我的構造函數中,我設置變量'self = this'。我這樣做是因爲我在我的應用程序中也使用jQuery,jQuery不像dojo那樣處理'this'。 – Brian

+0

你在你的構造函數中使用'var self = this'還是'self = this'?第二種情況是設置全局'self'這是非常非常糟糕的主意!您所提供的代碼中不需要「self」。只需用'this'替換'self',你就可以走了。 – twil

回答

1

對不起,我沒有提供答案越快,但我沒有找到一個解決方案。

我沒有讓我的dojo模塊繼承自dojo/Evented,而是使它從dijit/_WidgetBase繼承。通過這樣做,我的自定義dojo模塊/小部件現在實現了on函數。

因此,在我的第一個小部件中,我有一個名爲onSelectComplete : function (evt) {}的空函數,當我想要發出該事件時,我會調用它。

而且在我的第二個插件我的代碼是:

on(self._selector, "selectComplete", function(evt) { 
    console.log(evt); 
}); 
+0

這個要求是否有一個函數onXXX定義爲發射工作記錄在任何地方?我一直在努力,並沒有看到這方面的討論。 (謝謝,這正是我需要讓我的自定義事件工作!) – Chris

0

不要把事情說清楚:該onXXX功能是發射的老路上。 我很好,但它已被棄用!

到底什麼是'自我'?你的意思是:'這個'?

任何部件從道場繼承/事件觸發可以

on.emit(this, "select", {anyProperty: 'will be mixed in the event'}); 

以上是冒泡,這似乎是你想要做什麼?

你也可以做

this.emit("select", {anyProperty: 'will be mixed in the event'}); 

但這只是觸發一次,而不是向上冒泡。

從任何其他小工具,你可以訂閱你陳述。 告訴我,如果你需要一個工作的例子。

相關問題