2009-11-26 84 views
7

我有一個第三方Flash對象,我可以通過他們提供的JavaScript API進行操作。我嘗試在這個對象上聽一個事件,然後在我的對象內部激發事件以進一步激發事件。我碰巧在使用EXT Js,但我不認爲它在這裏很重要。addEventListener和這個的範圍

示例代碼

this.chart.addEventListener('create', function() { 
    this.fireEvent('created'); 
}, false) 

我的問題是,「這個」匿名函數內部是指引發該事件,而不是我的目標,我要開槍事件的對象。

它的另一個範圍問題。預先感謝您的幫助。

回答

0

這是解決這個問題的典型方法: -

(function(self) { 
    self.chart.addEventListener('create', function() {self.fireEvent('created');}, false); 
})(this); 
+2

我更喜歡'var self = this;'。創建一個函數,然後執行它,同時傳遞'this'作爲參數似乎有些過度 - 代碼也稍微長一些;-) – 2009-11-26 12:32:36

+0

@Andy:是的,當代碼存在於一個小的執行上下文中時,我也經常這樣做。然而,以上是標準方法,適用於更多種場景。'self'標識符的範圍僅限於閉包,在事件觸發之前,沒有後續代碼可能修改其中包含的值的危險。這不適用'var self = this;'方法。 – AnthonyWJones 2009-11-26 13:13:27

12

如何在引用'this'對象之前創建一個外部變量。 例如:

var _this = this; 
this.chart.addEventListener('create', function() { _this.fireEvent('created'); }, false) 
+4

是的,這是正常的習慣用法。閉包變量通常被稱爲'that'或'self'(儘管我認爲後者不是一個好主意,因爲'self'在JavaScript中已經存在 - 儘管無用 - 現有含義)。 – bobince 2009-11-26 11:48:31

+0

行得通。除了爲此設置變量之外,還有另一種方法。例如使用閉包? – Jonnio 2009-11-26 12:12:33

+1

@bobince:我更喜歡'self'。 'self'被'window'暴露了自己的引用。我很高興在其他範圍內重用標識符。在我看來,它具有正確的含義,並且不會與「自我」碰巧是窗口時的含義發生衝突。 – AnthonyWJones 2009-11-26 12:17:37

5

而其他的答案完成你所需要的,他們不以最有效的(可擴展)的工作方式,因爲它們最終不會從該視圖的邏輯(fireEvent())中分離視圖對象(this.chart)。在MVC應用程序中,這些視圖「決定」存在於控制器中。控制器「控制」意見並應包含視圖可能訪問的所有API。

在你的例子中,this是控制器,這很好(這意味着你要在正確的地方添加你的監聽器)。你真正需要做的是綁定處理程序的應該做的「處理」事情的範圍 - 在您的情況:this

// `this` is the controller of `chart` 
this.chart.addEventListener('create', function() { 
    this.fireEvent('created'); 
}.bind(this)); 

什麼此頁面上的其他答案做的是使它因此您的視圖將成爲自己的控制器,但只能在處理「創建」事件時,通過使用var self = this爲「控制器」分配臨時引用。再說一次,這很好,但它在事件驅動的應用程序中不能很好地工作,如果你有很多事件需要處理,它並沒有什麼意義。

.bind()是ECMAScript 5的一個實現。如果需要在更老的瀏覽器中工作,則在此描述一個好方法(使用functions.call()):https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/bind

+0

在一些MVC實現中(例如在此處描述的示例中:http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller),處理程序本身(例如'.fireEvent( )')在視圖中定義,但控制器根據需要調用它。這可以允許你根本不使用'.bind()'或自引用,但會使你的處理程序非常模糊;並且你的應用程序會變得非常大。 – Benny 2013-03-24 02:24:25