2012-12-23 137 views
1

我在嘗試創建一個從頁面返回特定字符串的ajax函數,然後將其設置在我創建的類中。然而,當我試圖阿賈克斯成功參數中調用this.setGlideUser,它告訴我,在AJAX請求之外設置變量

object has no function setUserGlide. 

當我嘗試調用this.setUserGlide外成功參數,然後看看_glideUser值,_glideUser是未定義。這是我的代碼片段。

function main() 
{ 
    this.start = true; 
} 

main.prototype.load = function() 
{ 
    var _glideUser; 
    $.ajax(
    { 
     url: '/home', 
     dataType: 'text', 
     success: function(data) 
     { 
      // Truncated 
      _glideUser = unescape(data).match(pattern); 
     } 
    }); 
    this.setGlideUser(_glideUser); 
    return 1; 
} 

main.prototype.setGlideUser(user) 
{ 
    return this._glideUser = user; 
} 

main.prototype.getGlideUser() 
{ 
    return this._glideUser; 
} 

var _main = new main(); 
_main.load(); 
// check that the ajax has completely loaded 
_main.getGlideUser(); // returns undefined 

我不能想辦法來設置在阿賈克斯成功函數的主類中_glideUser變量。我想在另一個函數中獲得_glideUser的值,用它來做事情。有什麼建議麼?

回答

3

沒有this._glideUser,因爲_glideUser是您的load函數的本地。而不是聲明var _glideUserload的,將其設置爲從構造一個公共屬性:

function main() 
{ 
    this.start = true; 
    this._glideUser = null; 
} 

(?您對setGlideUser第一個電話會真正創建這樣的屬性,而不是它混淆兼得)

另外,正如其他人提到的,您正在嘗試setGlideUser之前您的ajax操作完成。你需要做的是從success回調:

main.prototype.load = function() 
{ 
    var that = this; 
    $.ajax(
    { 
     url: '/home', 
     dataType: 'text', 
     success: function(data) 
     { 
      that.setGlideUser(unescape(data).match(pattern)); 
     } 
    }); 
    return 1; // what's the point? 
} 
+0

這很有效,謝謝!我沒有想過要設置一個'var this = this聲明,但這正是我所需要的。 – josh

0

success,則不會調用直到請求返回。它是異步。當數據值可用時,您需要在成功內部調用該方法。

main.prototype.load = function() 
{ 
    var _glideUser, that = this; 
    $.ajax(
    { 
     url: '/home', 
     dataType: 'text', 
     success: function(data) 
     { 
      // Truncated 
      var = _glideUser = unescape(data).match(pattern); 
      that.setGlideUser(_glideUser); 
     } 
    }); 
    // this.setGlideUser(_glideUser); this is incorrect 
    return 1; 
} 
1

我不是很熟悉的jQuery但Ajax請求可能是異步的,所以你必須從AJAX調用成功裏面調用setGlideUser,只是一個參考變量添加到您的實例,並從那裏調用它:

var self = this; 
$.ajax(
{ 
    url: '/home', 
    dataType: 'text', 
    success: function(data) 
    { 
     self.setGlideUser(unescape(data).match(pattern)); 
    } 
}); 

而只是一個快速提示你的是,你可以有getter和setter在這樣的JS:

main.prototype.__defineSetter__("glideUser", function(value) 
{ 
    this._glideUser = value; 
}); 

main.prototype.__defineGetter__("glideUser", function() 
{ 
    return this._glideUser; 
}); 

編輯: 其實,看到那東西的意見

+0

很高興您建議實際的訪問者屬性,但是__defineGetter__' /'__defineSetter__'都是非標準的並且不推薦使用。標準(ES5)的方式是使用['Object.defineProperty'](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperty)。 – bfavaretto

+0

哦,謝謝你指出,我有點過時的JavaScript – Delta

0

關鍵字這個意味着當前範圍,這是在(雙關語意圖)情況下的ajax對象。您需要通過在外部對象中指定me來引用此外部對象。

main.prototype.load = function() 
{ 
    var _glideUser; 
    var me = this; 
    $.ajax(
    { 
     url: '/home', 
     dataType: 'text', 
     success: function(data) 
     { 
      // Truncated 
      _glideUser = unescape(data).match(pattern); 
      me.setGlideUser(_glideUser); 
     } 
    }); 
    return 1; 
} 
0

試圖阿賈克斯成功參數

這是正確的中調用this.setGlideUser。但是,成功方法中的this keyword指向jqXHR對象,而不是指向main實例;你需要解除引用它:

var that = this; 
$.ajax({ 
    url: '/home', 
    dataType: 'text', 
    success: function(data) { 
     _glideUser = unescape(data).match(pattern); 
     that.setGlideUser(_glideUser); 
    } 
});