2012-04-11 102 views
1

我在寫一個Javascript應用程序,它通過AJAX獲取HTML文檔,然後需要處理它以將事件偵聽器(特別是Bootstrap彈出)附加到其中的元素。我很難附加聽衆,我認爲這是一個範圍問題。下面是相關的代碼:對象內的Javascript回調

var App = function(site){ 

    this.load = function(data, func){ 
    $('div.ajax').html(data); 
    func(); 
    } 

    this.dispatch = function(data){ 

    if(data.indexOf('from_server') !== -1){ 
     this.load(data, this.process); 
     console.log('Loaded view from Matisse.'); 
     return true; 
    } 

    } 

    this.process = function(){ 
    this.popovers('from_server'); 
    } 

    this.popovers = function(el){ 
    var that = this; 
    $('img.artwork.gallery', el).each(function(){ 
     $(this).popover({ trigger: 'hover', content: that.popoverPopulate(this) }); 
    }); 
    } 

    this.popoverPopulate = function(el){ 
    return $(el).next('div.popover_content').html(); 
    } 
} 

var APP = new App(); 

$.ajax({blah: blah, success: function(data){ APP.dispatch(data); }}); 

... 

的問題(我認爲)是this.loadfunc()電話。如果我通過它this.process(),那麼它將'this'範圍限定到窗口,並且出現錯誤。如果我通過this.process,它是一個創建的lambda,它仍然失敗。如果我打電話this.func()發生同樣的問題。

我該如何a)使用回調將應用範圍保存在App對象中,或者b)重新組織這個混亂以在加載後調用處理程序?

回答

5

我想像你想要使用的var that=this作用域招上所有的方法:

var App = function(site){ 

    var that = this; 

    this.load = function(data, func){ 
    $('div.ajax').html(data); 
    func(); 
    } 

    this.dispatch = function(data){ 

    if(data.indexOf('from_server') !== -1){ 
     that.load(data, that.process); 
     console.log('Loaded view from Matisse.'); 
     return true; 
    } 

    } 

    this.process = function(){ 
    that.popovers('from_server'); 
    } 

    this.popovers = function(el){ 
    $('img.artwork.gallery', el).each(function(){ 
     $(that).popover({ trigger: 'hover', content: that.popoverPopulate(this) }); 
    }); 
    } 

    this.popoverPopulate = function(el){ 
    return $(el).next('div.popover_content').html(); 
    } 
} 
+0

接受,因爲它排在第一位,但榮譽給伊利亞爲好。當答案出現時,我已經這樣做了,但謝謝。聽衆仍然沒有附加,但我認爲這是Bootstrap的問題,而不是我的Javascript。 – 2012-04-11 02:39:49

+0

啊,是的 - 我沒有使用bootstrap,所以我不熟悉它的問題。祝你好運! (另外,我會第二個榮譽@伊利亞爾 - 兩分鐘不是沒有。) – JKing 2012-04-11 02:45:25

1

這是指它是目前使用的上下文。所以當你做this.process它將會定位到窗口。如果您這樣做App.load(data, App.process)那麼它將針對App對象中的過程函數。

4

事情是這樣的:

var App = function(site){ 
    var self = this; //-<!!! 

    this.load = function(data, func){ 

    ... 

    this.dispatch = function(data){ 
     if(data.indexOf('from_server') !== -1){ 
      self.load(data, self.process); 
    ... 
+1

哈哈哈,我真的很喜歡你的「注意這個」的評論!這很好。另外,在最後一行(在「...」之前),你可能想在方法調用時使用'self'而不是'this'以及你傳入的引用,不是?或者'this'仍然是那個對象而不是'window'? – JKing 2012-04-11 02:28:24

+1

:-)你說得對。 – 2012-04-11 02:29:49