Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [js/jquery] zwracanie wartości przez funkcje, zmienne globalne i zasięg zmiennych
wujek_bogdan
post 18.10.2010, 11:31:36
Post #1





Grupa: Zarejestrowani
Postów: 76
Pomógł: 0
Dołączył: 8.03.2008

Ostrzeżenie: (0%)
-----


Nie do końca jest dla mnie jasna sprawa z zasięgiem zmiennych. Wiem jak sprawa wygląda w teorii, jednak w praktyce sobie z tym nie radzę. Chcę uniknąć tworzenia zmiennych globalnych jako pole obiektu window i rozwiązać sprawę bardziej elegancko.

Na początku przedstawię problem. Skrypt w PHP "search_dir.php" zwraca mi jakąś wartość np.: ilość plików danego typu w katalogu, ilość katalogów, listę plików w tablicy w zależności od podanych parametrów i robi to dobrze. Problem jest z przetworzeniem tych danych pobieranych ajaxem. Funkcja getDir() pobiera dane, a następnie przekazuje w callback zmienną 'data' do funkcji 'galleries(). Tutaj pojawia się problem. Chcę dalej operować na zmiennej data, ale nie chcę tworzyć nowego pola obiektu window.

Tworzę nowy obiekt 'gal' klasy Gallery() i w pole gal.count chcę wstawić, to co zwrócił mi skrypt w PHP (np. w tym wypadku ilość katalogów). W tym momencie mam sprzeczne informacje co do tego, co zwraca mi funkcja galleries().
Kod
        getDir('galeria');
        alert(data);
        alert(gal.count);

w takiej postaci otrzymuję 2 alerty: [Object] i 4 ((4 to ilość katalogów w podanym katalogu)
w tej postaci
Kod
        getDir('galeria');
        //alert(data);
        alert(gal.count);

otrzymuję jeden alert o pustej treści

w tej postaci
Kod
        getDir('galeria');
        alert(data);
        //alert(gal.count);

otrzymuję alert o treści [object]

Tutaj mam pytanie. Czemu w drugim przypadku otrzymuję pusty alert, zamiast alert o treści 4. W jaki sposób zwrócić wartość funkcji galleries(), tak żebym mógł z tej wartości dalej korzystać. Dane zwracane przez skrypt PHP będą służyły do dynamicznego generowania galerii zdjęć na podstawie zawartości podanego katalogu.

Kompletny kod skryptu:
CODE
<script type="text/javascript">

//var data;
Gallery = function() {}
Gallery.prototype.name = ''
gal = new Gallery();

$(document).ready(function() {

function getDir(dir){

$.post('search_dir.php', {
'directory': dir,
'type': 'directory'
}, function(data){
galleries(data);
});

}

function getDirContent(dir){

$.post('search_dir.php', {
'directory': dir,
'type': 'directory',
'extension': 'jpg',
'list': 'true'
}, function(data){
//alert(data);
});

}

function galleries(data) {
gal.count = data;
};

getDir('galeria');
alert(data);
alert(gal.name);

});


Ten post edytował wujek_bogdan 18.10.2010, 13:40:36
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 1)
#luq
post 19.10.2010, 13:30:40
Post #2





Grupa: Zarejestrowani
Postów: 589
Pomógł: 91
Dołączył: 22.05.2008
Skąd: Gliwice

Ostrzeżenie: (0%)
-----


Tu chodzi o asynchroniczność. Dla przykładu:

Kod
function getDir(dir){

$.post('search_dir.php', {
'directory': dir,
'type': 'directory'
}, function(data){
galleries(data);
});


Funkcja:

Kod
function(data){
galleries(data);
}


Wywoła się dopiero po odebraniu od serwera odpowiedzi (readyState == 4) wiec jeśli napiszesz:

Kod
getDir('foo/');
alert(123); // w tym miejscu nie ma pewnosci (tak samo jak wszedzie ponizej) czy juz zostala wywolana funkcka galleries()



--------------------
Moja gra - scraby.io
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 18:30