Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript]This w JS / widocznosc zmiennej
Forum PHP.pl > Forum > Przedszkole
topgun777
Czesc
Mam taki problem ze nie wiem jak zrobic żeby funkcja Test poprawnie widziała zmienną thisUser.imie? Czym to moze być spowodowane ze jej nie widzi (wypisuje undefined) ? wiem ze po przeniesieniu jej wywolonia do funkcji anonimowej w request jest ok ale chce miec wywolanie Test w funkcji init po pobraniu informacji o userze. Czy mam ktos pomysł? nie chce tez zmieniać thisUser.imie na zmienną globalną imie chce zeby byla ona częścia obiektu User. Ponizej załączam kod:
CODE
function User(id){

var thisUser = this;
this.UID = id;
this.imie = "";
this.nazw = "";
this.login = "";
this.phone = "";
this.email = "";

this.init = function(){
thisUser.getUserInfo();

// thisUser.Test();
}

this.getUserInfo = function(){
var url = host + 'getUserInfo/'+thisUser.UID;
var wynik;
new Ajax.Request(url,{
method:'post',
onSuccess: function(e) {
wynik = eval('(' + e.responseText + ')');

thisUser.imie = wynik[0].imie;
thisUser.nazw = wynik[0].nazw;
thisUser.phone = wynik[0].phone;
thisUser.email = wynik[0].mail;
thisUser.login = wynik[0].login;



}

});

}

this.Test = function(){
alert("LOGIN:"+thisUser.imie);
}

...
...
.....
}
erix
Nie widzi, gdyż zmienną deklarujesz z frazą var, co nadaje jej lokalną "moc".
topgun777
Cytat(erix @ 16.02.2010, 16:49:24 ) *
Nie widzi, gdyż zmienną deklarujesz z frazą var, co nadaje jej lokalną "moc".


Tzn. jak mam to zapisać w kodzie zeby nie byla? Ale tutaj to wogole z tego co mam to jest ona i tak nadrzędna do podfunkcji w podanej funkcji która jest moją klasą usera więc powinna być zasięgowania do tych funkcji ale nie jest...
zegarek84
Cytat(topgun777 @ 16.02.2010, 22:25:38 ) *
Tzn. jak mam to zapisać w kodzie zeby nie byla? Ale tutaj to wogole z tego co mam to jest ona i tak nadrzędna do podfunkcji w podanej funkcji która jest moją klasą usera więc powinna być zasięgowania do tych funkcji ale nie jest...

tak... nadrzędna?? - nie dałeś całego kodu a liczysz na odpowiedźquestionmark.gif - skopiuj kod - nie trzeba kopiować by widzieć, że domknięcia się nie zgadzają ;p - dałeś fragment flaków i piszesz, że nadrzędna - wyżej dostałeś prawidłową odpowiedź gdyż na to co dałeś jest "podrzędna" - a też mogło by działać gdyby gdzieś był return tego czy coś tam - w sumie nie wiem jak tu tworzysz obiekty - czy przez return czy przez new funkcja...

ps. po kiego czorta Ci zmienne prywatne jak widzę, że zajebiście trzymasz się tutaj hermetyzacji ^^ - jeśli wykonujesz coś przez eval to do tego musisz mieć dostęp ze zmiennych globalnych window ^^ winksmiley.jpg...

ogólnie jak pomyslisz to ten link Ci pomoze niżej winksmiley.jpg - a jak nie dajesz całości lub linku do strony to nie licz na większą pomoc od innych winksmiley.jpg
[jQuery] Snake, Wężyk z prostą grafą.


ps. w tej "podrzędnej" funkcji jeśli nie dasz var przed thisUser to ta zmienna wyląduje w globalnym obiekcie window i wszędzie do niej będziesz miał zasięg winksmiley.jpg - ale wtedy łątwo mozna ją nadpisać ;p
topgun777
Tak wczesniej w innej klasie robię obiekty User:
CODE
t.Podlaczeni[t.PodlaczeniCnt] = activeUsers[i].id_user;
t.Users[t.PodlaczeniCnt] = new User(activeUsers[i].id_user,t.PodlaczeniCnt);
t.Users[t.PodlaczeniCnt].init();
t.PodlaczeniCnt++;


ponizej załączam obecną wersje USER:
CODE
function User(id,row){

this.UID = id;
this.TableRow= row;
this.imie = "";
this.nazw = "";
this.login = "";
this.phone = "";
this.email = "";
var thisUser = this;

this.init = function(){
thisUser.getUserInfo();
thisUser.DrawRow();
}

this.getUserInfo = function(){

var url = host + 'getUserInfo/'+thisUser.UID;

new Ajax.Request(url,
{ method:'post',
onSuccess: function(x) {
var wynik = eval('(' + x.responseText + ')');
thisUser.imie = wynik[0].imie;
thisUser.nazw = wynik[0].nazw;
thisUser.phone = wynik[0].phone;
thisUser.email = wynik[0].mail;
thisUser.login = wynik[0].login;

}
});
}

this.DrawRow = function(){

if(!document.getElementById('row_'+thisUser.TableRow)){
try{
var wiersz = document.getElementById('obiekty').insertRow(thisUser.TableRow+1); //pierwszy row to header tabelki
wiersz.setAttribute('id','row_'+thisUser.TableRow);

var td1 = wiersz.insertCell(0);
// td1.setAttribute('onMouseover',"Tip('Kliknij aby śledzić w nowym oknie tego użytkownika<br/><b>Dane użytkownika:<b><br/> <i> "+thisUser.imie+" "+thisUser.nazw+"</i> <br/> email: "+thisUser.email+" <br/> Numer tel.: "+thisUser.phone+" <br/> Kolor użytkownika: <span style=\"background:"+thisUser.marker.color+";\">"+thisUser.marker.color+"</span>');" );
// td1.setAttribute('onmouseout',"UnTip();");
td1.innerHTML = thisUser.login;
td1.style.width = "20%";

var td2 = wiersz.insertCell(1);
td2.setAttribute('onMouseover',"Tip('Pokaż pozycje <br/>użytkownika na mapie');" );
td2.setAttribute('onmouseout',"UnTip();");
td2.innerHTML = '<a href="#"><img src="'+host+'/img/lornetka.gif" OnClick="c('+thisUser.UID+');" /></a>';
td2.style.width="13%";

var td3 = wiersz.insertCell(2);
td3.setAttribute('id','td4_'+thisUser.TableRow);
td3.style.width="10%";
td3.innerHTML = '<button onclick="lock('+thisUser.TableRow+');">blokuj</button>';

var td4 = wiersz.insertCell(3);
td4.setAttribute('onMouseover',"Tip('Zaznacz aby dodać wybranego użytkownika <br/> do listy śledzonych obiektów');" );
td4.setAttribute('onmouseout',"UnTip();");
td4.setAttribute('class',"right");
td4.innerHTML = '<input id="track_'+thisUser.TableRow+'" type="checkbox" onchange="track('+thisUser.TableRow+')"/>';
td4.style.width="5%";
}
catch(e){
}
}
}

this.Test = function(){
alert("LOGIN: "+thisUser.login);
}



this.Info = function(){

alert(thisUser.imie+", "+
thisUser.nazw+", "+
thisUser.phone+", "+
thisUser.email+", "+
thisUser.login+" ."
);

}


}


Ogolnie wczesniej dokladnie zarysowałem to o co mi chodziło nie widziałem sensu dawania tutaj całej klasy,
chodzi o to ze DrawRow nie widzi tych zmiennych pisze undefined a thisUser nie moge zrobic globalną bo jak napisałes nie chce jej nadpisać gdyż obiektów user bedzie setki wiec każdy musi miec "swoj" globalny w jego ramach "this".



To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.