Atareq

Hace tiempo sufrí la extraña manera de JavaScript para gestionar el contexto de los objetos, concretamente de la palabra reservadathis. Veamos un ejemplo de código JQuery:



$.each(this.fields, function(i, field) {

if (field.required && this.isNull(field)) {

this.put(field, "El campo + $(field.labelId).text() + es obligatorio");
ret = false;
} else if(field.email && !this.validateEmail(field)) {

this.put(field, "El campo + $(field.labelId).text() + no es una dirección válida");
ret = false;
}
});

Esta función forma parte de una clase, así que pensamos que se puede hacer uso de this para referenciar miembros de la misma. Sin embargo, la llamada this.validateEmailprovocará un error indicando que validateEmail no es una función. La explicación es que esa llamada sucede dentro del ámbito de una función nueva, $.each(this.fields, function(i, field)..., por lo que el contexto de this se pierde. En Prototype, al menos, se resolvía con un binding, que consiste en agregar .bind(this) al final de la función, de esta forma:


$.each(this.fields, function(i, field) {

if (field.required && this.isNull(field)) {

this.put(field, "El campo + $(field.labelId).text() + es obligatorio");
ret = false;
} else if(field.email && !this.validateEmail(field)) {

this.put(field, "El campo + $(field.labelId).text() + no es una dirección válida");
ret = false;
}
}.bind(this));

Pero esto no funciona en JQuery, así que tras algunas búsquedas infructuosas, he tenido que improvisar y he hallado un método que funciona. Consiste en asignar this a una variable, que uso en lugar de la palabra reservada:


var self = this;
$.each(self.fields, function(i, field) {

if (field.required && self.isNull(field)) {

self.put(field, "El campo + $(field.labelId).text() + es obligatorio");
ret = false;
} else if(field.email && !self.validateEmail(field)) {

self.put(field, "El campo + $(field.labelId).text() + no es una dirección válida");
ret = false;
}
});

De esta forma, podemos seguir usando los atributos y métodos de nuestra clase sin temor a perder el contexto.

P.S.: Sé que podría usar el plugin validation de JQuery, pero no he visto que funcione a no ser que el formulario se envíe. En mi caso, ni siquiera estoy usando formularios. De todas formas, acepto sugerencias.
Atareq, 06/FEB/2010 (en Nuevas tecnologías)
Corregido por Atareq. Última revisión a las 19:34 del 06/FEB/2010
Imprime el artículoEnvíaselo a un amigoEnvíalo a del.icio.usMenéalo en MenéameEnvíalo a FURLEnvíalo a DiggEnvíalo a Reddit
Publicar un comentario
Nombre:
Sitio web:
Correo-e: