Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript] jQuery, callback i obiekty...
Forum PHP.pl > Forum > Przedszkole
ayeo
Witam!

Zacznę od kodu:
  1. function Chat()
  2. {
  3. this.url = "data.html";
  4.  
  5.  
  6. this.getData = function()
  7. {
  8. var options = {url : this.url, success : this.refreshPage };
  9. $.ajax( options );
  10. }
  11.  
  12. this.parseView = function()
  13. {
  14. alert("wonnaaa!");
  15. }
  16.  
  17. this.refreshPage = function( html )
  18. {
  19. this.parseView();
  20. }
  21. }
  22.  
  23.  
  24. $(document).ready(function()
  25. {
  26. chat = new Chat;
  27. chat.getData();
  28. });


Ten kod wywala mi błąd "this.parseView is not a function". Dodam, że jeżeli wywołam tą metodę bezpośrednio w metodzie getData() (a nie jako callback) to wszystko działa. Jeśli ktoś może mnie oświecić to będę zobowiązany.

Z góry dziękuję za pomoc, pozdrawiam!
singles
Wydaje mi się, żę dzieje się tak dlatego, ponieważ this w ciele metody refreshPage nie odnosi się do obiektu klasy Chat, tylko do obiektu ajax. Kiedy wyrzucisz do konsoli FireBuga obiekt this w róznych miejscach, to zauważysz różnicę:
Kod
function Chat() {
    this.url = 'data.html';
    this.test = 'To jest obiekt Chat()';
    console.log(this);
    this.getData = function() {
        var options = {url : this.url, success : this.refreshPage };
        $.ajax( options );
    }
    var parseView = function(){
        alert("wonnaaa!");
    }
    this.refreshPage = function( html ){
        console.log(this);
        parseView();
    }
}

$(document).ready(function() {
    chat = new Chat;
    chat.getData();
});


Przy pierwszym console.log masz obiekt chat, co można poznać po obecności składowej test. Przy następnym console.log opalonym już w ciele callbacka, masz już obiekt ajax jQuery - masz składowe global i type - porównaj z opcjami z manuala: jQuery.

Zamieniłem metodę parseView() z publicznej na prywatną, jak widać działa. Jednym z rozwiązań będzie przekazanie metodzie this.parseView() obiektu klasy Chat jako parametru i w ciele metody operowanie już na nim.
jaco
Rozwiązaniem problemu nadpisywania this przez jQuery jest stworzenie sobie "kopii" tego obiektu w klasie a następnie używanie go zamiennie do this.

Kod
function Chat()
{
    aliasThis = this;
    ...
}
ayeo
Dzięki winksmiley.jpg
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.