2013-01-11 32 views
0

我有一個名爲Clientes的類。我有一個在AJAX中提出請求的函數。請看下圖:引用類中的問題

Clientes.prototype.listar_clientes = function(){ 

var url = "funcoes_ajax_clientes.php"; 
var params = "id_funcao=1"; 
var xmlhttp = chama_funcao_php_ajax(url, params); 

xmlhttp.onreadystatechange=function(){ 
if (xmlhttp.readyState==4 && xmlhttp.status==200){ 
    var resposta_ajax = xmlhttp.responseText; 
    var elementos_listbox_clientes = manipulacao_strings.separa_dados_string(resposta_ajax); 
    var html_div_listbox_elementos = "<select name = \"listbox_elementos\" id = \"listbox_elementos\" multiple>"; 
    for(var contador = 0; contador < elementos_listbox_clientes.length; contador+=2){ 
     var indice_id = contador; 
     var indice_nome = contador + 1; 
     var indice_id_cliente = contador/2; 
     this.ids_clientes.push(elementos_listbox_clientes[indice_id]); 
     elemento_listbox_clientes = elementos_listbox_clientes[indice_nome]; 
     html_div_listbox_elementos+= "<option>"; 
     html_div_listbox_elementos+= elemento_listbox_clientes; 
     html_div_listbox_elementos+= "</option>"; 
    } 
    html_div_listbox_elementos+= "</select>"; 
    elementos_javascript.set_html_elemento("div_listbox_elementos", html_div_listbox_elementos); 
} 
} 

xmlhttp.send(params);  
} 

this.ids_clientes.push(elementos_listbox_clientes[indice_id]); 

我想引用Clientes類,但XMLHTTP類被引用。在這種情況下,我如何參考Clientes類?

在此先感謝。

+0

Hey Max,JavaScript中沒有任何類。如果您繼續以其他語言來思考JavaScript,您會遇到很多問題。以下是http://bonsaiden.github.com/JavaScript-Garden/ – Azder

回答

1

在回調函數外創建一個變量來保存範圍。

var url = "funcoes_ajax_clientes.php"; 
var params = "id_funcao=1"; 
var xmlhttp = chama_funcao_php_ajax(url, params); 
var that = this; //<-- create a variable to hold the scope 
xmlhttp.onreadystatechange=function(){ 
if (xmlhttp.readyState==4 && xmlhttp.status==200){ 
    var resposta_ajax = xmlhttp.responseText; 
    var elementos_listbox_clientes = manipulacao_strings.separa_dados_string(resposta_ajax); 
    var html_div_listbox_elementos = "<select name = \"listbox_elementos\" id = \"listbox_elementos\" multiple>"; 
    for(var contador = 0; contador < elementos_listbox_clientes.length; contador+=2){ 
     var indice_id = contador; 
     var indice_nome = contador + 1; 
     var indice_id_cliente = contador/2; 
     that.ids_clientes.push(elementos_listbox_clientes[indice_id]); 
     elemento_listbox_clientes = elementos_listbox_clientes[indice_nome]; 
     html_div_listbox_elementos+= "<option>"; 
     html_div_listbox_elementos+= elemento_listbox_clientes; 
     html_div_listbox_elementos+= "</option>"; 
    } 
    html_div_listbox_elementos+= "</select>"; 
    elementos_javascript.set_html_elemento("div_listbox_elementos", html_div_listbox_elementos); 
} 
} 
+0

中的一些「奇怪」的東西(如「this」)。謝謝。我現在測試這個並且工作正常。 –

+0

我總是避免使用它,如果我能爲它找到更好的名字,甚至可以避免使用它。問題是,不久就會有太多這樣的事情發生,這會讓事情變得混亂。 – Azder

+0

或者你可以使用這個函數onreadystatechange(){ } xmlhttp.onreadystatechange = onreadystatechange.bind(this); – Atlantrix

0

爲了避免局部範圍的增值經銷商,你可以這樣做:

var url = "funcoes_ajax_clientes.php"; 
var params = "id_funcao=1"; 
var xmlhttp = chama_funcao_php_ajax(url, params); 
function changeCallback(){ 
    if (xmlhttp.readyState==4 && xmlhttp.status==200){ 
    var resposta_ajax = xmlhttp.responseText; 
    var elementos_listbox_clientes = manipulacao_strings.separa_dados_string(resposta_ajax); 
    var html_div_listbox_elementos = "<select name = \"listbox_elementos\" id = \"listbox_elementos\" multiple>"; 
for(var contador = 0; contador < elementos_listbox_clientes.length; contador+=2){ 
    var indice_id = contador; 
    var indice_nome = contador + 1; 
    var indice_id_cliente = contador/2; 
    this.ids_clientes.push(elementos_listbox_clientes[indice_id]); 
    elemento_listbox_clientes = elementos_listbox_clientes[indice_nome]; 
    html_div_listbox_elementos+= "<option>"; 
    html_div_listbox_elementos+= elemento_listbox_clientes; 
    html_div_listbox_elementos+= "</option>"; 
} 
html_div_listbox_elementos+= "</select>"; 
elementos_javascript.set_html_elemento("div_listbox_elementos", html_div_listbox_elementos); 
} 
} 
xmlhttp.onreadystatechange = changeCallback.bind(this); 

一般來說,當你想使用綁定方法的特定範圍內調用一個函數。