El problema que tenemos aquí es que las variables item
cambia con cada bucle. Cuando hace referencia a item
en algún momento posterior, se utiliza el último valor que tenía. Puede usar una técnica llamada closure (esencialmente una función que devuelve una función) para ubicar rápidamente la variable de forma diferente.
for (var i in this.items) {
var item = this.items[i];
$("#showcasenav").append("<li id=\"showcasebutton_"+item.id+"\"><img src=\"/images/showcase/icon-"+item.id+".png\" /></li>");
$("#showcasebutton_"+item.id).click(
// create an anonymous function that will scope "item"
(function(item) {
// that returns our function
return function() {
alert(item.id);
self.switchto(item.id);
};
})(item) // immediately call it with "item"
);
}
Una nota al margen - Veo que tiene jQuery aquí. Tiene una función auxiliar $.each()
que se puede usar con matrices, y puede ser un atajo para bucles simples para cada uno. Debido a la forma en que funciona el alcance en esta llamada, no necesitará utilizar un cierre porque "elemento" ya es el parámetro de la función cuando se llamó, no almacenado en un var
en el alcance de la función principal, como era cierto en su ejemplo.
$.each(this.items,function(i, item) {
$("#showcasenav").append("<li id=\"showcasebutton_"+item.id+"\"><img src=\"/images/showcase/icon-"+item.id+".png\" /></li>");
$("#showcasebutton_"+item.id).click(function() {
alert(item.id);
self.switchto(item.id);
});
});
Encontré una solución más elegante para usted después del hecho: compruebe la ventaja de usar '$ .each()' – gnarf
¡Gracias! Solo paso un rato tratando de crear un cierre para usar una variable local dentro de mi devolución de llamada por clic. La parte difícil para mí es eliminar los parámetros de la función que se devuelve. – Sam