Parameter in Callback-Funktion übergeben
IrisKant
- javascript
Ich würde gern den Icon-Text für jedes Icon auf der Karte ändern, stelle mich aber irgendwie zu blöd an. Ihr seht in der LoadMap-Funktion wie ich versuche Variable tex zu ändern, was aber so nicht geht. Bitte um Hilfe...
<script type="text/javascript">
var myMap = null;
var tex = "Text";
var jb = new VELatLong(52, 12);
function LoadMap()
{
myMap = new VEMap("mapDiv");
myMap.LoadMap();
tex = "Text1";
StartGeocoding("Halle-Saale");
tex = "Text2";
StartGeocoding("Berlin HBf");
tex = "Text3";
StartGeocoding("Biederitz");
}
function UnloadMap()
{
if (myMap != null) {
myMap.Dispose();
}
}
function StartGeocoding( address )
{
myMap.Find(null, // what
address, // where
null, // VEFindType (always VEFindType.Businesses)
null, // VEShapeLayer (base by default)
null, // start index for results (0 by default)
null, // max number of results (default is 10)
null, // show results? (default is true)
null, // create pushpin for what results? (ignored since what is null)
false, // use default disambiguation? (default is true)
null, // set best map view? (default is true)
GeocodeCallback ); // call back function
}
function GeocodeCallback(shapeLayer, findResults, places, moreResults, errorMsg)
{ // if there are no results, display any error message and return
if(places == null)
{
alert( (errorMsg == null) ? "Kein echtes Ergebnis gefunden" : errorMsg );
return;
}
var bestPlace = places[0];
var location = bestPlace.LatLong;
var newShape = new VEShape(VEShapeType.Pushpin, location);
var desc = "Latitude: " + location.Latitude + "<br>Longitude:" + location.Longitude;
newShape.SetDescription(desc);
newShape.SetTitle(bestPlace.Name);
var icon = "<div style='font-size:12px;border:solid 1px" +
"Black;background-color:Aqua;width:25px;'>"+tex+"</div>"; //
myMap.ShowMessageBox = false;
newShape.SetCustomIcon(icon);
myMap.AddShape(newShape);
myMap.SetCenterAndZoom(jb, 6);
}
</script>
Warum übergibst Du "tex" dann nicht einfach als zusätzlichen Parameter an die Funktion "StartGeocoding"? So läufst Du in das Problem rein, dass die Variablen in unterschiedlichen Scopes geführt werden - wobei man ziemlich leicht die Übersicht verlieren kann, wenn man nicht weiß, was man tut.
Gruß, LX
Als zusätzlichen Parameter hab ich's versucht, komme aber nicht weiter. Ich müste ja dann auch "tex" an die Callback-Funktion übergeben. Da weiß ich aber nicht, wie das mit den anderen fünf Parametern geht.
<script type="text/javascript">
var myMap = null;
var jb = new VELatLong(52, 12);
function LoadMap()
{ myMap = new VEMap("mapDiv");
myMap.LoadMap();
StartGeocoding("Halle-Saale", "Text in Halle");
StartGeocoding("Berlin HBf", "Text in Berlin");
StartGeocoding("Biederitz", "Text in Biederitz");
}
function UnloadMap()
{ if (myMap != null) { myMap.Dispose(); } }
function StartGeocoding( address, tex )
{ myMap.Find(null, // what
address, // where
null, // VEFindType
null, // VEShapeLayer
null, // start index for results
null, // max number of results
null, // show results?
null, // create pushpin
false, // use default disambiguation?
null, // set best map view?
GeocodeCallback(tex) ); // call back function
}
function GeocodeCallback(shapeLayer, findResults, places, moreResults, errorMsg)
{ //
if(places == null)
{ alert( (errorMsg == null) ? "Kein echtes Ergebnis gefunden" : errorMsg );
return;
}
var bestPlace = places[0];
var location = bestPlace.LatLong;
var newShape = new VEShape(VEShapeType.Pushpin, location);
var desc = "Latitude: " + location.Latitude + "<br>Longitude:" + location.Longitude;
newShape.SetDescription(desc);
newShape.SetTitle(bestPlace.Name);
var icon = "<div style='font-size:12px;border:solid 1px" +
"Black;background-color:Aqua;width:25px;'>"+tex+"</div>"; //
myMap.ShowMessageBox = false;
newShape.SetCustomIcon(icon);
myMap.AddShape(newShape);
myMap.SetCenterAndZoom(jb, 6);
}
</script>
Habe versucht den Parameter wie gesagt weiterzugeben, aber es geht nicht so.
Hat noch jemand eine Idee?
Entweder Du schleifst ihn konsequent durch oder überdenkst Dein Konzept hinsichtlich eines objektorientierten Ansatzes.
In diesem Fall würdest Du beispielsweise von einem Prototypen namens GeoLocation ausgehen, der sowohl einen Namen als auch eine Beschreibung als eben auch weitere Geo-Informationen beinhaltet.
Dann brauchst Du nur noch das Objekt übergeben und seine prototypischen Methoden bedarfsweise anzureichen und musst nicht überlegen, wie Du welche Informationen übergeben sollst, da diese innerhalb des Objekts immer verfügbar sind.
Gruß, LX
Ich habe keinen objektorientierten Ansatz.
Ich habe keine Ahnung was prototypische Methoden sind.
Ich habe keine Ahnung ;-(
Ich habe keinen objektorientierten Ansatz.
Ich habe keine Ahnung was prototypische Methoden sind.
Ich habe keine Ahnung ;-(
Das kann man leicht ändern. Stelle Dir vor, Du hast eine Art Schablone, mit denen Du Objekten bestimmte Eigenschaften und Methoden mitgeben kannst. Diese Schablone nennt sich in JavaScript "prototype"; jedes Objekt hat so eine Schablone, wobei sie meistens vom Objekt des jeweiligen Typs (String, Number, Object, Array, etc.) geerbt sind.
Also nehmen wir mal eine Funktion geoLocation und versehen sie mit einer solchen Schablone, in der sich beispielsweise die Methode "geoCode" befindet:
function geoLocation(address, text){
// wenn keine Paramter angegeben sind, mache nichts:
if (!address && !text) { return; }
// ansonsten erzeuge eine neue Instanz mit der eigenen Schablone:
var location = new geoLocation();
// befülle sie mit den entsprechenden Werten:
location.address = address;
location.text = text;
// und gebe sie zurück:
return location;
};
geoLocation.prototype={
geoCode: function() {
// arbeite mit this.address und this.text
}
}
// dann kannst Du damit folgendes machen:
geoLocation('Halle-Saale', 'Halle-Saale-Text').geoCode();
geoLocation('Berlin HBf', 'Total häßlicher Bahnhof').geoCode();
Ich hoffe, das hilft Dir weiter.
Gruß, LX