Carga AJAX em conjunto com Getters e Setters
-
26-09-2019 - |
Pergunta
Tenho trabalhado com getters e setters para evitar a perspectiva de usar variáveis globais.No entanto, me deparei com um problema.O código abaixo, que funciona bem com variáveis inteiras, gera uma exceção quando tento executar uma chamada AJAX.Alguém pode me explicar por que isso está acontecendo?
function Object_XML() {
me = this;
me.xml = null;
}
Object_XML.prototype = {
getXML: function() {
return me.xml
},
setXML: function(data) {
me.xml = data;
},
loadXML: function() {
$.ajax({
type: "GET",
url: "questions.xml",
dataType: "xml",
success: function(xml) {
me.setXML(xml);
} //close success
});//close AJAX
}//close setXML
};
$(document).ready(function() {
var data = new Object_XML();
alert("This is an " + data.getXML());
data.setXML();
alert("This is an " + data.getXML());
});
Obrigado, Elliot Bonneville
Solução
Você acabou de negar o uso de variáveis privadas com getters e setters usando me = this;
Você acabou de fazer me
uma variável global ao não usar var
.(qualquer variável não definida usando var é anexada ao namespace global)
No seu caso, como você está trabalhando no mesmo escopo de objeto, você pode simplesmente usar this
e evite o me
pessoalmente, acho que é confuso.Mas se você quiser seguir esse paradigma, use var me = this;
Seu exemplo não está muito claro, onde ocorre o erro?Você está ligando data.setXml()
sem parâmetros, então me.xml
apostará definida para undefined
.Isso é esperado se você não passar nada para o método.
Lembre-se também de que, devido à natureza assíncrona da sua chamada, se você fizesse algo como:
data.loadXml();
console.log("data.getXML();", data.getXML()); // would be undefined
data.getXML() naquele momento ainda estaria indefinido, pois é provável que sua chamada assíncrona ainda não tenha retornado, portanto, não definindo o atributo xml do seu objeto.