Problem masz tutaj to, że zmienna item
zmian z każdej pętli. Kiedy odwołujesz się do item
w jakimś późniejszym punkcie, używana jest ostatnia wartość, którą trzymał. Możesz użyć techniki o nazwie closure (zasadniczo funkcja, która zwraca funkcję), aby szybko zmienić zmienną w inny sposób.
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"
);
}
Notatka boczna - Widzę, że masz tutaj jQuery. Ma funkcję pomocniczą $.each()
, która może być używana z tablicami i może być skrótem dla prostych dla/każdej pętli. Ze względu na sposób, w jaki działa to wywołanie - nie trzeba używać zamknięcia, ponieważ "element" jest już parametrem funkcji, gdy został wywołany, a nie przechowywany w numerze var
w zakresie funkcji nadrzędnej, tak jak w przypadku przykład.
$.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);
});
});
Znalazłeś dla siebie bardziej eleganckie rozwiązanie - sprawdź zaletę używania '$ .each()' – gnarf
Dziękujemy! Po prostu spędzam trochę czasu, próbując utworzyć zamknięcie, aby użyć zmiennej lokalnej w moim wywołaniu zwrotnym kliknięcia. Trudna część dla mnie usunięcie parametrów z zwracanej funkcji. – Sam