2010-06-30 6 views
5

Ich baue eine ASP.NET MVC-Site, auf der ich eine Google Maps Javascript-API-Karte haben möchte, die Marker von meinem Backend über AJAX lädt.Strategie zum Lazy-Loading von Markern in eine Google Maps JavaScript API-Karte

Da ich nicht möchte, dass der Client in Speicherprobleme läuft, möchte ich Lazy-Load die Markierungen und wenden Sie sie auf Fluster2, um sie in Cluster. Ich denke, der beste Weg zum Lazy-Load der Marker ist das Hinzufügen eines Ereignis-Listeners zum idle Event der Map, der auftritt, nachdem die Map geschwenkt oder gezoomt wurde.


Hier ist meine aktuelle Strategie:

  1. hinzufügen Ereignis-Listener idle Ereignis.
  2. Wenn idle Ereignis ausgelöst wird, verwenden Sie jQuery, um einen AJAX HTTP POST Aufruf an mein Back-End, das aktuelle Ansichtsfenster/Grenzen der Karte zu liefern.
  3. Das Backend gibt alle Punkte im Ansichtsfenster zurück.
  4. Die Punkte werden in Markern erstellt und zu Fluster2 hinzugefügt, wodurch sie zur Karte hinzugefügt werden. Alte Punkte werden NICHT verworfen.
  5. Repeat

Doch diese Probleme schaffen kann, wie die alten Punkte nicht verworfen werden. Ich möchte sie nicht verwerfen, da ich sie nicht noch einmal laden möchte, aber mit meiner derzeitigen Strategie würde ich sie ein zweites Mal laden und für sie ein zweites Mal Marker erstellen.

Während ich es ist keine gute Idee, denke irgendwie das Backend in dem AJAX-Aufruf zu sagen, dass ich bereits einige des Markers habe, wäre es schön, zu irgendeine Art von Hash-Tabelle implementieren, die Duplikate nicht zulässt, dass .

Wenn ich die Punkte lade, kann ich versuchen, sie zuerst zur Hashtabelle hinzuzufügen: Wenn das gelingt, habe ich sie noch nicht angezeigt, also kann ich sie als Marker hinzufügen; Wenn es fehlschlägt, sind sie bereits auf der Karte.


Ist das eine gute Strategie? Wenn ja, wie kann ich eine Hashtabelle implementieren, die keine Duplikate zulässt?

Antwort

3

Ich habe vor kurzem etwas ziemlich ähnliches implementiert; Während ich persönlich entschied, alle Marker zu entfernen und die Karten komplett neu zu füllen, mag ich deine Gesamtstrategie und denke, dass sie den Benutzer auch flüssiger machen könnte, da das kurze Flackern zwischen dem Entfernen aller Marker und dem Hinzufügen der neuen verschwindet. Also ja, ich würde sagen, es ist eine gute Strategie.

Leerlauf ist ein interessantes Ereignis; Ich habe festgestellt, dass onZoom usw. nicht besonders gut funktioniert und sich für TileLoaded (oder ähnlich) entschieden hat. Funktioniert gut für mich, aber scheint ein bisschen wie ein Hack.

In Bezug auf Ihre Hashtabfrage - es gibt zwei mögliche Orte, an denen Sie eine solche Karte speichern könnten.

a) Server Wenn Sie verfolgen können, an welche Seite Sie Koordinaten senden, können Sie eine dotnet-Hashtabelle der Marker in Ihrem Sitzungsstatus behalten.Dies kann verhindern, dass Sie unnötige Koordinaten an den Client senden, aber es ist mehr Fehler imo

b) Client Dies ist wahrscheinlich, was Sie sowieso wollen. Hier sollte ein normales JavaScript assoziatives Array Ihr Freund sein.

var x = {"some key": "some value"}; 
document.write ("some key" in x); // True 
document.write ("some other key" in x); // False 

Es sei denn, Sie eine gute Art und Weise abzubilden lat und lng in einem einzigen hashable Wert zu finden, können Sie ein Array von Arrays halten müssen:

var markers = {lat1: {lng11: 1, lng12: 1, lng13: 1}, lat2: ...} 

und dann prüfen, wie

... 
if (checklat in markers) 
    if (checklng in markers[checklat]) 
     return True 
return False 

Ich sehe nur, dass dies eine ältere Frage ist. Viel zu spät, vielleicht hilft es noch.

+0

Danke für Ihre Hilfe! Ich werde versuchen, dies zu implementieren. –

+0

Für den Hash-Schlüssel können Sie ein google.maps.latLng-Objekt aus Ihrem lat/long erstellen und dessen toString() -Methode verwenden. – dsas