Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [JavaScript] jQuery, callback i obiekty...
ayeo
post 13.05.2009, 14:32:07
Post #1





Grupa: Przyjaciele php.pl
Postów: 1 202
Pomógł: 117
Dołączył: 13.04.2007
Skąd: 127.0.0.1

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


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!


--------------------
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
singles
post 13.05.2009, 22:09:43
Post #2





Grupa: Zarejestrowani
Postów: 121
Pomógł: 26
Dołączył: 2.07.2007

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


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.


--------------------
Works for me => u mnie działa - blog o (o)programowaniu i nie tylko
meet.php - darmowe meetupy związane z PHP
Go to the top of the page
+Quote Post
jaco
post 14.05.2009, 12:34:24
Post #3





Grupa: Zarejestrowani
Postów: 115
Pomógł: 1
Dołączył: 15.01.2003

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


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;
    ...
}


Ten post edytował jaco 14.05.2009, 12:35:40
Go to the top of the page
+Quote Post
ayeo
post 14.05.2009, 13:03:59
Post #4





Grupa: Przyjaciele php.pl
Postów: 1 202
Pomógł: 117
Dołączył: 13.04.2007
Skąd: 127.0.0.1

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


Dzięki winksmiley.jpg


--------------------
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: 14.08.2025 - 05:06