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
Hat 'refreshStuff' keine asynchrone Funktionsaufrufe machen? Es wäre besser, wenn Sie ein [mcve] geben würden, anstatt überall Kommentare abzugeben. – 4castle
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
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