2009-06-04 5 views
1

aufrufen Ich habe die Funktion unten. Alles funktioniert gut, außer für die Push-, Pop- und Remove-Methode. Diese Methode sollte vom Event-Handler aufgerufen werden. Dieses Ereignis wird von der Google Maps API ausgelöst.Wie öffentliche Methode von einem Ereignishandler

Das Problem ist, dass wenn das Ereignis ausgelöst wird, diese Methoden nicht gefunden werden. Ich habe eine "Push ist nicht definiert" Fehlermeldung.

Ich versuchte mit diese, aber das funktioniert nicht.

Wie rufe ich die öffentliche Methode aus dem Event-Handler?

Danke Jungs

function Track(mapContainer) { 
var map = mapContainer; 
var points = new Array(); 

var isEditMode = false; 

var clickListener; 

this.Push = function(point) { ... } 

this.Pop = function() { ... } 

this.Remove = function(point) { ... } 

//Enable/disable the marker placements 
this.PlaceWaypoint = function(isPlacing) { 
    if (isPlacing != true) { 
     if (clickListener != null) { 
      google.maps.event.removeListener(clickListener); 
      clickListener = null; 
     } 
    } else { 
     clickListener = map.AddEvent("click", function(event) { 
      if (!IsDoubleClick()) { 
       var point = map.PlaceMarker(new WayPoint(event.latLng)) 
       point.RemoveListener(function() { Remove(point); }); 
       Push(point); 
      } else { 
       Pop(); 
      } 
     }); 
    } 
} 
} 

Antwort

3

Sie haben ein Schließ-/Bindungsproblem. Eine Konvention, die häufig verwendet wird, um eine Variable mit der Bezeichnung self von , diediese, die dank der Verschlusseigenschaften von JS später verwendet werden kann.

function Track(mapContainer) { 
    var map = mapContainer, 
     points = new Array(), 
     isEditMode = false, 
     clickListener, 
     // Make a variable self that points to this, that can be used inside closures 
     // where the original context is lost 
     self = this; 

    this.Push = function(point) { ... } 

    this.Pop = function() { ... } 

    this.Remove = function(point) { ... } 

    //Enable/disable the marker placements 
    this.PlaceWaypoint = 
     function(isPlacing) { 
      if (isPlacing != true) { 
       if (clickListener != null) { 
        google.maps.event.removeListener(clickListener); 
        clickListener = null; 
       } 
      } else { 
       clickListener = map.AddEvent("click", function(event) { 
        if (!IsDoubleClick()) { 
         var point = map.PlaceMarker(new WayPoint(event.latLng)) 
         point.RemoveListener(function() { Remove(point); }); 
         // Use the closure reference self instead of this 
         self.Push(point); 
        } else { 
         // Use the closure reference self instead of this 
         self.Pop(); 
        } 
       }); 
     }; 
} 
2

Vor allem Pop und Push-ist nicht global, das zweite im inneren Umfang eine andere Bedeutung hat. So können Sie die Schließung verwenden und die "this" in eine Variable mit einem globaleren Geltungsbereich umbenennen.

+0

es ist wahrscheinlich besser, Umfang dies die Funktion, indem Sie var davor setzen, sonst wird die Variable $ this überschrieben, wenn mehrere Instanzen von Track vorhanden sind, und Methoden werden auf der falschen Instanz aufgerufen. – PatrikAkerstrand

+0

@Machine, danke wurde auf Fehler hingewiesen, habe es entsprechend behoben. –

2

this bezieht sich immer auf den Kontext der aktuellen Funktion, wenn Sie also this in Ihrem Ereignishandler verwenden bezieht es sich auf die Funktion this nennt, nicht die this in Ihrer Track Funktion.

einen Verschluss zu schaffen, die this ein äußeren Umfang greift, müssen Sie die this eine neue Variablen zugewiesen werden, die von der inneren Funktion zugegriffen werden kann:

var self = this; 
this.PlaceWaypoint = function(isPlacing) { 
    // ... 
    self.Pop(); 
    // ... 
} 
Verwandte Themen