2016-08-07 11 views
-1

Ich habe eine Website, die ich mit Google Maps Integration mache. Unten ist ein Beispielcode, der das Layout zeigt und wo ich Probleme habe, ich denke, dass es um den Umfang geht, aber ich kann es nicht herausfinden. Die Maps-API ruft initMap() auf, sobald sie über die API in irgendwas geladen wurde. Sie muss innerhalb von initMap ausgeführt werden, aber ich muss auch obj eine globale Variable sein, damit auf sie zugegriffen werden kann und Dinge erledigt werden, nachdem initMap() beendet wurde.Javascript Objekteigenschaften null außerhalb der Mitgliedsfunktionen

var obj = {}; 
var initMap = function() { 
    obj = { 
    "map": null, 
    "locations": null, 
    "refreshStuff": function() { 
     // Do things to populate all the null values 
     // i.e. 
     obj.locations = [0,1,2,3,4,5]; 
     alert(/*message to show values are what they should be*/); // They are 
     }, 
    "otherThings": "otherThings" 
    }; 
    obj.refreshStuff(); 
    alert(/*message to check values are still what they should be*/); // They're null 
    }; 
alert(/*message to check values are still what they should be*/); // They're null 

Gibt es einen Grund, dass obj ist null Eigenschaften sind das Zurücksetzen einmal auf null außerhalb der Funktion, die sie setzt?

EDIT 1

Das Mitglied vairables zurückkehrt nicht immer auf null, sie zurückkehrt, was auch immer sie sind uns zunächst, ich null nur anfänglich für alle von ihnen verwenden.

obj = { 
    "location_ex1": null, 
    "location_ex2": 0 
    }; 
alert(obj.location_ex1); // null 
alert(obj.location_ex1); // 0 

EDIT 2

Hier ist ein Full-Code-Snippet für eine Funktion, die nicht die Werte korrekt

obj = { 
    // ... 
    "userLocationFirstRun": true, 
    "refreshUserLocation": function() { 
    if (navigator.geolocation) { 
     navigator.geolocation.getCurrentPosition(function(position) { 
     obj.userLocation.position = new google.maps.LatLng(position.coords.latitude, position.coords.longitude); 
     if (obj.userLocationFirstRun) { 
      obj.userLocationFirstRun = false; 
      obj.userLocation.marker = new google.maps.Marker({ 
      map: obj.map, 
      position: obj.userLocation.position, 
      draggable: false, 
      icon: { url: "/images/location_marker.png" } 
      }); 
      } 
     alert(JSON.stringify(obj.userLocation.position)); // <-- Correct coords 
     }, function() { 
      //Geolocation error - Service failed 
      alert("Geolocation service failed"); 
      }); 
     } 
    else { 
     //Geolocation error - No geolocation ability 
     alert("Geolocation service not available"); 
     } 
    }, 
    "userLocation": { 
    "marker": null, 
    "position": null, 
    } 
    // ... 
    }; 
obj.refreshUserLocation(); 
alert(JSON.stringify(obj.userLocation.position)); // <-- null 
+1

Hat 'refreshStuff' keine asynchrone Funktionsaufrufe machen? Es wäre besser, wenn Sie ein [mcve] geben würden, anstatt überall Kommentare abzugeben. – 4castle

+0

Dort ist Ajax drin, um Standortdaten zu laden, aber es sind nicht nur Dinge, die durch Ajax geladene Daten gesetzt werden. Ich habe Elemente wie Benutzer Standortkoordinaten, die über HTML5-Navigator geladen werden auch auf Null zurückgesetzt. Bis jetzt wird jede Elementvariable, die innerhalb einer Elementfunktion gesetzt wird, wie auch immer ich sie einstelle, auf Null zurückgesetzt. – FatalKeystroke

+0

Ich habe es gerade getestet und sie werden nicht auf Null zurückgesetzt, sondern auf den Wert zurückgesetzt, der in der Membervariablendeklaration als Standard festgelegt wurde. d. h. "locations": null gibt null und "locations" zurück: 0 retuens 0 – FatalKeystroke

Antwort

1

Ich glaube, Einstellung, dass, wenn Sie verwenden obj innerhalb von refreshStuff, seine obj der ist gleich zu {}, bevor obj aktualisiert wird, um die Refresh-Funktion zu haben, wenn yes eee was ich meine.

In der Tat bin ich richtig, Beweis:

https://jsfiddle.net/9szgwyru/

+0

Also, wenn ich richtig folge, muss ich das Layout für das gesamte Objekt erstellen, ohne die Funktionen und dann für die do obj.functionName = function() {} hinterher zu setzen? Ist es wichtig, dass Sie obj.refreshStuff außerhalb von initMap setzen? Weil ich sie alle innerhalb von initMap() erstellen muss, ansonsten habe ich keinen Zugriff auf das Google Maps API. – FatalKeystroke

+0

Hier ist der Deal, Sie setzen obj auf ein neues Objekt mit einer Funktion, die auf ein Objekt wirkt. Wenn Sie jedoch die Funktion definiert haben, war obj immer noch das alte Objekt ({}), da Sie es gerade auf ein neues Objekt setzen. Also ist das 'obj' in der Refresh-Funktion das alte und nicht das, auf das Sie es einstellen. Ist das sinnvoll? – Hunter

+0

Verstanden. Danke, ich habe gerade etwas Code umgestellt und getestet. Danke @Hunter – FatalKeystroke