Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] callback functions in JS Bibliotheken

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] callback functions in JS Bibliotheken

    Hallo community,

    ich komme irgendwie mit den Callback function der ganzen JS-Bibliotheken nicht zurecht. Folgende syntax ist ja üblich:

    PHP-Code:
    objekt.function(parametercallbackFunction
    In der regel sieht sowas ungefähr so aus:

    PHP-Code:
    objekt.doSomething(parameter, function() { do something after this }) 
    Jetzt will ich aber dieser funktion parameter übergeben, doch irgendwie scheint das auch nicht ganz zu funktionieren. Im aktuellen Fall geht es um die GMap-API aber da ich generell probleme mit diesen callbacks habe suche nach einem Tutorial oder ähnlichem.

    Hier noch ein Schnipsel vom aktuellen problem:

    PHP-Code:
    // an der stelle existiert eine variable "daten"
    // die informationen enthält die ich in der callback function nutzen möchte
    marker = new GMarker(new GLatLng(latlng), {iconmarkerIcon});
    map.addOverlay(marker);

    GEvent.addListener(marker"click", function() {
        
    alert(daten); // geht nicht
    }); 

  • #2
    Doch, das muesste funktionieren, verwendete Variablen werden verfuegbar gemacht. Allerdings hast du bei Events natuerlich das Problem, dass die Funktion irgendwann ausgefuehrt werden koennte, sich der Wert der Variable also moeglicherweise seit der Deklaration veraendert hat. Auf die Variable wird nur verwiesen.


    Sprich:
    Code:
    var daten = 5;
    myFunc = function() {
      alert(daten);
    }
    daten = 6;
    myFunc(); // Ausgabe = 6
    "[URL="http://www.youtube.com/watch?v=yMAa_t9k2VA&feature=youtu.be&t=25s"]Mein Name ist Lohse, ich kaufe hier ein.[/URL]"

    Kommentar


    • #3
      richtig und genau aus dem Grund müsste ich eigentlich sowas wie

      PHP-Code:
      var daten 5;
      myFunc = function(daten) {
        
      alert(daten);
      }
      daten 6;
      myFunc(); // Ausgabe = 6 
      machen, was aber nicht funktioniert. Daher möchte ich mein wissen zu callbacks etwas vertiefen, sodass ich einen weg finde diese Problemathik anders zu lösen. Leider konnte ich aber bissher nirgendwo eine erklärung zu dem ganzen zeug finden. Als ob ich der einzige währe der callbacks nicht ganz versteht.

      Kommentar


      • #4
        Du kannst das schon als Parameter nutzen, nur musst du den Parameter beim Aufruf dann eben auch uebergeben. Das schwierige ist glaube ich nicht das Verstaendnis fuer die Funktionalitaet (so wie ich das sehe auch bei dir nicht), sondern der Ueberblick ueber die Variablenscharen und Events, synchron, asynchron, per Referenz, Kopie, oder?
        "[URL="http://www.youtube.com/watch?v=yMAa_t9k2VA&feature=youtu.be&t=25s"]Mein Name ist Lohse, ich kaufe hier ein.[/URL]"

        Kommentar


        • #5
          Nur hat sich der parameter zum zeitpunkt des aufrufs ja schon geändert. Und ja das ganze callback zeug treibt mich jedesmal in den wahnsinn. Sowohl bei Jquery als auch bei GMAP (die von mir am meisten verwendeten apis).

          Hier mal der richtige Code zur verdeutlichung:
          PHP-Code:
          /*
           * showDealers ist ein array nach dem muster:
           * array(
           *   [0] => array(
           *       ['lat'] => 1245
           *       ['lng'] => 1245
           *       ['name'] => 'ich'
           *   )
           *   [1] => array(
           *       ['lat'] => 9871
           *       ['lng'] => 4567
           *       ['name'] => 'du'
           *   )
           *   usw....
           * )
           */
          0;
          do {
              
          dealer showDealers[i];
              
              
          markerIcon = new GIcon(G_DEFAULT_ICON);
              
              
          marker = new GMarker(new GLatLng(dealer["lat"], dealer["lng"]), {iconmarkerIcon});
              
          map.addOverlay(marker);
              
              
          GEvent.addListener(marker"click", function() {
                  
          alert(dealer["name"]);
              });
              
          i++;
          } while(
          showDealers.length); 
          wenn ich i irgendwie der function übergeben könnte, dann könnte ich zumindest noch auf showDealers zugreifen, doch dass geht auch nicht -.-

          Ich bin echt am ende.

          Kommentar


          • #6
            Üblicherweise bekommst du für Events noch Zusatzinfos. Was gibt denn (bei aktiviertem Firebug)
            Code:
            GEvent.addListener(marker, "click", function() {
              console.log(arguments);
            });
            aus?
            "[URL="http://www.youtube.com/watch?v=yMAa_t9k2VA&feature=youtu.be&t=25s"]Mein Name ist Lohse, ich kaufe hier ein.[/URL]"

            Kommentar


            • #7
              Ein Objekt, vermutlicherweise der "marker"
              Angehängte Dateien

              Kommentar


              • #8
                Du hast dort aber ein ganz anderes Problem. Pro Schleifendurchlauf hast du ja unterschiedliche dealer["name"] Werte, diese werden aber in der Callbackfunktion nicht gespeichert! Heißt erst wenn du den Klick machst DANN wird die Callback ausgeführt UND DANN wird auf dealer["name"] zugegriffen. In dem Moment wird das wahrscheinlich gar nicht mehr existieren weil die do-while schon längst abgelaufen ist! Hier musst du also die Werte irgendwie außerhalb der do-while speichern und durch den Klick auf den Marker den richtigen Wert finden. Heißt vlt. könntest du IM Marker den Wert "name" Speichern und in der Callbackfunktion versuchen darauf zuzugreifen. Also vor der Callback marker.dealerName = "blub" und in der Callback dann sowas wie this.dealerName, bin mir aber da grad nicht sicher ob das alles so funktioniert.

                Kommentar


                • #9
                  Das Problem war mir schon klar, nur kann ich keine Lösung finden. Hab nicht daran gedacht das ich selbst attribute definieren könnte. Aber folgender versuch:
                  PHP-Code:
                  do {
                      
                  dealer showDealers[i];
                      
                      
                  markerIcon = new GIcon(G_DEFAULT_ICON);
                      
                      
                  marker = new GMarker(new GLatLng(dealer["lat"], dealer["lng"]), {iconmarkerIcon});
                      
                  marker.dealerData dealer;
                      
                  map.addOverlay(marker);
                      
                      
                  GEvent.addListener(marker"click", function() {
                          var 
                  dealerData marker.dealerData;
                      });
                      
                  i++;
                  } while(
                  showDealersLength); 
                  führt auch nur dazu das dealer als referenz und nicht als kopie übergeben wird.

                  Kommentar


                  • #10
                    Mach mal in der Schleife marker.myOptions = i und lass das ganze wie eben auch ausgeben.

                    Edit: Ja deshalb probiers mal mit skalaren Werten.
                    "[URL="http://www.youtube.com/watch?v=yMAa_t9k2VA&feature=youtu.be&t=25s"]Mein Name ist Lohse, ich kaufe hier ein.[/URL]"

                    Kommentar


                    • #11
                      OK, kommando zurück hat doch funktioniert. Muss aber this.dealerData und nicht marke.dealerData heissen:
                      PHP-Code:
                          GEvent.addListener(marker"click", function() {
                              var 
                      dealerData this.dealerData;
                          }); 
                      Danke Leute ihr habt mir den Tag geretet

                      Kommentar


                      • #12
                        Ich habs oben ja mit "this" gemacht

                        Kommentar


                        • #13
                          Dein Beitrag war so einleuchtend dass ich den nicht aufmerksam durchgelesen habe. Bin gleich zum testen gesprintet und dann passieren halt solche Fehler

                          Kommentar

                          Lädt...
                          X