Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript]Funkcja nie jest funkcją.
Forum PHP.pl > Forum > Przedszkole
MeGusta
Witam,
Czemu pluje mi, że funkcja nie jest funkcją? Dodam, że jeśli umieszczę jej wywołanie poza forEach normalnie działa.

  1.  
  2. this.drawInventory = function(item)
  3. {
  4. document.getElementById('player_inv').innerHTML += item;
  5. return false;
  6. };
  7.  
  8. this.inventory.forEach(function(item) {
  9. this.drawInventory(item);
  10. });


Błąd:
Uncaught TypeError: this.drawInventory is not a function
markuz
Przed tym forEach zrób var self = this; i w funkcji używaj self zamaist this. Bo this w tej funkcji to coś innego niż poza nia.
MeGusta
Żeby nie zakładać nowego tematu, w obiekcie mam zdefiniowane zmienne, this.name ... itd, w funkcji chce nadpisać te zmienne lecz coś nie działa.

  1. this.playerData = function()
  2. {
  3. $.ajax({ type: 'POST', url: 'engine.php', data: { task: 1 }}).done(function(data)
  4. {
  5. d = data.split('|');
  6. this.name = d[1]; // nie nadpisuje, d[1] pełne
  7. this.level = d[2]; // nie nadpisuje
  8. });
  9.  
  10. };
  11.  
  12. this.playerData();
markuz
To samo co wyżej, this w funkcji którą podajesz w done nie dot. tego obiektu tylko ajaxa. Musisz zrobić np. var self = this; przed $.ajax a w funkcji używać self zamiast this.
MeGusta
Niestety nadal nie nadpisuje, mój cały kod:

  1. var player = function(){
  2.  
  3. this.name = 'xyz';
  4. this.level = 1;
  5.  
  6. this.playerData = function()
  7. {
  8. var self = this;
  9. $.ajax({ type: 'POST', url: 'engine.php', data: { task: 1 }}).done(function(data){
  10.  
  11. d = data.split('|');
  12.  
  13. self.name = d[1];
  14. self.level = d[2];
  15.  
  16. });
  17.  
  18. };
  19.  
  20. this.playerData();
  21. }
  22.  
markuz
Ja bym to napisał w ten sposób:

[JAVASCRIPT] pobierz, plaintext
  1. var Player = function(options) {
  2. this.name = options.name || 0;
  3. this.level = options.level || 0;
  4. this.init();
  5. };
  6.  
  7. Player.prototype = {
  8. constructor: Player,
  9. init: function() {
  10. var self = this;
  11. this.getData({ task: 1 }, function(d) {
  12. var data = d.split('|');
  13. self.name = data[1];
  14. self.level = data[2];
  15. });
  16. },
  17. getData: function(data, onDone) {
  18. $.ajax({ type: 'POST', url: 'engine.php', data: data}).done(onDone);
  19. }
  20. };
  21.  
  22. var player = new Player();
[JAVASCRIPT] pobierz, plaintext


Pisałem z palca, mogą być literówki. Jak nie działa, to sprawdź czy na pewno otrzymujesz dane, jaki mają format itp. Zrób console.log(data) i pokaż co tam trzymasz.
MeGusta
Teraz wypluwa:
  1. player.js:3 Uncaught TypeError: Cannot read property 'name' of undefined


3 linijka:

  1. this.name = options.name || null;
markuz
No. I co teraz zrobisz? Jakieś pomysły?
MeGusta
Szczerze to średnio. Nie mam pojęcia.
markuz
Ok. To wywał options z argumentu i przypisz domyślne wartości dla name i level tj. this.name = null; this.level = 0;
MeGusta
Kurcze, no juz w morde nie wiem, jak nie nadpisywało tak nie nadpisuje.

  1. var Player = function(options) {
  2.  
  3. this.name = null;
  4. this.level = 0;
  5.  
  6. this.init();
  7.  
  8. };
  9.  
  10.  
  11. Player.prototype = {
  12. constructor: Player,
  13. init: function() {
  14. var self = this;
  15. this.getData({ task: 1 }, function(d) {
  16.  
  17. var data = d.split('|');
  18. self.name = data[0];
  19. self.level = data[1];
  20. console.log(self.name) // zwraca prawidłowo
  21. });
  22. },
  23. getData: function(data, onDone) {
  24. $.ajax({ type: 'POST', url: 'engine.php', data: data}).done(onDone);
  25. },
  26. getName: function()
  27. {
  28. return this.name;
  29. }
  30. };
  31.  
  32. var player = new Player();
  33.  
  34. console.log(player.getName()); // zwraca null


Jakieś pomysły?
markuz
Linijka 34 wykona się wcześniej niż 17,18, 19, itd. Zapytanie AJAX trochę trwa, a skrypt wykona się bardzo szybko.
MeGusta
Jak mógłbym rozwiązać ten problem aby działało to w ten sposób w jaki chce.
markuz
Z konstruktora usuń this.init();
Do init: function() dodaj parametr (callback) np. onDone i wywołaj go po wyczytaniu danych.
Wywołaj init po utworzeniu obiektu Player i w parametrze umieść funkcje w której sobie pobierasz name tj.
player.init(function() {
console.log(player.getName());
});
viking
Całe jquery 3 bardzo mocno opiera się na Promise. Jeżeli zaimplementujesz u siebie wtedy pierwszym krokiem będzie jquerowy ajax albo natywne fetch do pobrania danych i dopiero wyciąganie danych o użytkowniku.
MeGusta
Panowie, nie wiem czy dobrze zrozumiałem, ale zrobiłem coś takiego, działać działa, ale pytanie czy to jest poprawnie?
W funkcji getData w callbacku wywołuje funkcje która będzie (jest) odpowiedzialna za wyświetlanie już pobranych zmiennych, tak myślę i na dłuższą drogę to chyba nie ma sensu, to funkcji korzystających z tych zmiennych będzie dużo więcej, a callbacka do każdej nie bd dodawał. Ktoś poratuje?

  1. var Player = function() {
  2.  
  3. this.name = null;
  4. this.level = 0;
  5.  
  6. this.init();
  7.  
  8. };
  9.  
  10.  
  11. Player.prototype = {
  12. constructor: Player,
  13. init: function() {
  14. var self = this;
  15. this.getData({ task: 1 }, function(d) {
  16. var data = d.split('|');
  17. self.name = data[0];
  18. self.level = data[1];
  19. });
  20. },
  21. getData: function(data, onDone) {
  22. var self = this;
  23. $.ajax({ type: 'POST', url: 'engine.php', data: data}).done(onDone, function(){ self.loadGame(); });
  24. },
  25. loadGame: function()
  26. {
  27. $('#player_name').text('Nazwa: ' + this.name);
  28. $('#player_lvl').text('Level: ' + this.level);
  29. },
  30. };
markuz
Czy chcesz aby obiekt Player sterował też zachowaniem gry - tak jak to napisałeś (metoda loadGame w Player). Jeżeli tak, to może warto w ogóle porzucić obiekty albo zrobić 1 o nazwie Game ew. wywalić logikę Game do nowego obiektu Game a Player zostawić jak jest.

Co do pytania to przenieś wywołanie metody self.loadGame(); do init() po przypisaniu name i level, getData ma służyć tylko do komunikacji z engine.php.



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.