Rafał G.

Rafał G. Programista
aplikacji
internetowych

Temat: Ajax.InPlaceEditor - problem z inicjalizacja

Powiedzmy, że mam taki HTML:

<div id="refresh">
<div id="product_2_qty" class="editor_tr">5</div>
<div id="product_3_qty" class="editor_tr">6</div>
</dvi>


Chciałbym użyć na tych dwóch divach InPlaceEditor, więc napisałem taką funkcję:


function initEditors()
{
var tds = $$('div.editor_tr');
var tdsLenght = tds.length;
var tempArr = null;

for (i=0; i<tdsLenght; i++)
{
tempArr = tds[i].id.split('_');

new Ajax.InPlaceEditor('product_'+tempArr[1]+'_qty', 'skrypt.php', {
okControl: 'button',
cancelControl: 'button',
okText: '',
cancelText: '',
size: 14,
callback: function(form, value)
{
return 'product_id='+tempArr[1]+'&qty='+encodeURIComponent(value);
}
});

}
}


Funkcję tą wywołuję gdzieś poniżej tych divów (przy załadowaniu strony). Problem plega na tym, że nawet jeśli wywołam edytorek na pierwszym divie, na którym zmienna produkt_id powinna przyjąć wartość "2", to i tak przyjmuje wartość "3", czyli tego drugiego diva, tak jakby została użyta instancja edytora z ostatniej iteracji tej pętli.
Id w skrypcie pobierają się prawidłowo (wyświetliłem za pomocą alert()).

Uprzedzę też pytanie - robię to w ten sposób, bo div "refresh" jest odświeżany za pomocą Ajax i po odświeżaniu InPlaceEditor w ogóle nie działa, jeśli go ponownie nie zainicjuję (mogą to zrobić za pomocą callbacka Ajax wywołując w/w funkcję).

Co może powodem mojego problemu? Może ewentualnie znacie inny sposób zainicjowania edytora np. wywołanie jakiejś funkcji przy pomocy onClick każdego z tych divów?
Janusz Skudrzyk

Janusz Skudrzyk Członek zarządu,
weblabs.pl

Temat: Ajax.InPlaceEditor - problem z inicjalizacja

a jak treść diva refresh jest wpisana na stałe, a initEditors ma wywołanie tworzenia dwóch inplaceeditorów bezpośrednio ?
Rafał G.

Rafał G. Programista
aplikacji
internetowych

Temat: Ajax.InPlaceEditor - problem z inicjalizacja

Wtedy działa bez najmniejszego problemu.
Janusz Skudrzyk

Janusz Skudrzyk Członek zarządu,
weblabs.pl

Temat: Ajax.InPlaceEditor - problem z inicjalizacja

Specjalnie zassałem cały pakiet, wrzuciłem (nawet z dynamicznie wstawianą treścią do #refresh) i działa jak trzeba, nawet w programie udającym przeglądarkę

Może cache przeszkadza ? ctrl+f5
Rafał G.

Rafał G. Programista
aplikacji
internetowych

Temat: Ajax.InPlaceEditor - problem z inicjalizacja

Hm... Ale użyłeś funkcji podobnej do mojej, czyli przy założeniu, że ilość divów w "refresh" może być różna?
Janusz Skudrzyk

Janusz Skudrzyk Członek zarządu,
weblabs.pl

Temat: Ajax.InPlaceEditor - problem z inicjalizacja

hmmm ... a może faktycznie

pid = form.id.split('_')[1] ;
return 'product_id='+pid+'&qty='+encodeURIComponent(value);

odebrane dane $_POST: Array
(
[product_id] => 2
[qty] => 5
[editorId] => product_2_qty
)

Edit: z editorId też można pobrać id produktuJanusz Skudrzyk edytował(a) ten post dnia 12.04.09 o godzinie 12:27
Rafał G.

Rafał G. Programista
aplikacji
internetowych

Temat: Ajax.InPlaceEditor - problem z inicjalizacja

Fakt - można, chociaż to dodatkowa komplikacja, bo znowu po stronie serwera trzeba rozbijać stringa. Ale czemu produkt_id przyjmuje taką wartość? Bardzo dziwne jak dla mnie.

Spróbuję popytać jeszcze na Google Groups - może tam mi ktoś tą sprawę wyjaśni.

konto usunięte

Temat: Ajax.InPlaceEditor - problem z inicjalizacja

troche dziwne ze uzywasz prototype i iterujesz sie po tym przy pomocy for zwyklego. Problemem nie jest "zasieg" zmiennych?

A takie cos dziala?

function initEditors()
{
$$('div.editor_tr').each(function(element) {
var id = element.id.split('_')[1];

new Ajax.InPlaceEditor(element.id , 'skrypt.php', {
okControl: 'button',
cancelControl: 'button',
okText: '',
cancelText: '',
size: 14,
callback: function(form, value) {
return 'product_id=' + id + '&qty=' + encodeURIComponent(value);
}
});
});
}
Rafał G.

Rafał G. Programista
aplikacji
internetowych

Temat: Ajax.InPlaceEditor - problem z inicjalizacja

Dzięki - wygląda na to, że rozwiązałes mój problem. :)
Prototype znam, jak teraz widzę, zbyt pobieżnie.

Na czym dokładnie ten błąd polegał? Wspominasz o "zasięgu" zmiennych, ale co dokładnie masz na myśli? Callback z jakiegoś powodu nie widzi wartości która ma być przypisana do "product_id" we wcześniejszych iteracjach, tylko w ostatniej?

konto usunięte

Temat: Ajax.InPlaceEditor - problem z inicjalizacja

dokladnie :).

masz ta petle for i w niej przypisujesz zawartosc zmiennej "tempArr" a definicja jej jest poza petla. Teraz kolejnosc zdarzen ktora nastepuje:
1. przypisujesz pierwsza wartosc do "tempArr"
2. tworzysz nowy obiekt Ajax.InPlaceEditor i ustawiasz ta funkcje callback
3. petla przechodzi do konca nadpisujac wartosc
4. callback "odpalany" dopiero jest w momencie powstania zdarzenia ktore je wywoluje.
5. JS "szuka" tej zmiennej "tempArr" zeby postawic ja do stringa
6. znajduje twoja "globalna" zmienna dla tej funkcji i bierze wartosc (de fakto ostatnia z petli).

Mam nadzieje ze w miare jasno napisalem o co chodzi :). Ogolnie ciezko takie rzeczy sie debuguje bo tu chodzi o czas wykonania danej funkcji i co ona widzi :).

W mojej iteracji w skrocie dla kazdego edytowalnego div'a tworzona jest wlasna zmienna id :).

edit:
wiecej o "magii" JS w bardzo fajnym tutorialu:
http://ejohn.org/apps/learn/Krzysztof Kluska edytował(a) ten post dnia 14.04.09 o godzinie 18:50



Wyślij zaproszenie do