2013-05-02 14 views
6

Lavorare su un'app Google Map creata con AngularJS.Perché non vengono visualizzate tutte le tile di Google Map sul carico iniziale di un'app AngularJS?

sandbox attualmente dispiegati: http://of.xchg.com/

Fai clic link e si noterà solo una tessera EVENTUALI sono resi.

Se quindi ridimensionare la finestra del browser, poi il resto delle piastrelle mappa renderà completamente.

Ecco il progetto git: https://github.com/LarryEitel/of4

Perché non sono tutti Google mappa piastrelle resi?

C'è un modo per testare la completa rendering di piastrelle?

C'è un modo per forzare la re-rendering di tutte le tessere della mappa?

risposta

0

Dopo un sacco di tentativi ed errori, ho trovato una soluzione. Semplicemente iniettando il servizio GoogleMap nel comando di esecuzione dell'app, ha reso correttamente la mappa completa. Ho anche dovuto fare il percorso predefinito '/' mostrare la pagina della mappa. Qualsiasi altra cosa che farei in questo caso provando a passare da una pagina di casa (senza mappa) alla pagina della mappa risulterebbe in una mappa parzialmente renderizzata. :(

Forse o qualcuno sarà suggerire una soluzione più elegante. :)

// Generated by CoffeeScript 1.6.1 
    (function() { 
    'use strict'; 
    angular.module('of4App', []).config(function($routeProvider) { 
     return $routeProvider.when('/menu', { 
     templateUrl: 'views/menu.html', 
     controller: 'MainCtrl' 
     }).when('/list', { 
     templateUrl: 'views/list.html', 
     controller: 'MainCtrl' 
     }).when('/map', { 
     templateUrl: 'views/map.html', 
     controller: 'MapCtrl' 
     }).when('/about', { 
     templateUrl: 'views/main.html', 
     controller: 'MainCtrl' 
     }).otherwise({ 
     redirectTo: '/map' 
     }); 
    }).run(function($rootScope, $location, GoogleMap) { 
     var rootScope; 
     rootScope = $rootScope; 
     rootScope.navBarHeight = 40; 
     return rootScope.mapShown = function() { 
     var mapShown; 
     mapShown = $location.path().indexOf('/map') > -1; 
     return mapShown; 
     }; 
    }); 

    }).call(this); 
+0

Ho fatto una domanda correlata [qui] (http://stackoverflow.com/questions/16444095/google-map-render-events-can-the-be-watched) e @varun mi ha indirizzato a un buon [suggerimento] (http://stackoverflow.com/questions/7341769/google-maps-v3-how-to-tell-when-an-imagemaptype-overlays-tiles-are-finished-lo/7355063#7355063). –

+0

Solo curioso: perché il downvote? – Mawg

13

chiamare questa funzione nel controller mappa:

google.maps.event.trigger(map, 'resize'); 

Questo dovrebbe fare il trucco.

+0

Grazie per la risposta. Un piccolo dettaglio è che per mantenere lo stato della mappa, io inserisco GoogleMap come servizio nel controller principale. Poi mostro/nascondo come necessario. La vista iniziale ha la mappa nascosta. Idealmente, sarebbe bello iniettare la mappa inizializzata in MainController solo su FIRST 'mostra' della mappa. Ecco un collegamento al codice finora: http://goo.gl/8ClMo –

+0

Vedo che nel tuo codice (in app.js) stai impostando MainCtrl come controller anche per views/map.html. Se lo cambi a MapCtrl, penso che dovrebbe darti la separazione desiderata tra le preoccupazioni che stai cercando.Quindi devi solo inserire il servizio GoogleMap nel controller Mappa e chiamare quel trigger di ridimensionamento in quel controller invece del MainCtrl. – jesal

+0

Ha apportato le modifiche suggerite con lo stesso comportamento. Di interesse è che se faccio un aggiornamento hard su/#/map, ottengo NO map ... anche dopo che ridimensiono il browser. –

2

ho trovato questo problema quando si cerca di centrare nuovamente la mappa dopo la vista caricato. Ci sarebbe una singola tessera nell'angolo in alto a sinistra.

Ho notato che stava centrando la mappa nella parte superiore dello div (0,0) e ho calcolato che doveva misurare lo div prima che fosse visibile. Ciò significherebbe che le dimensioni erano 0px, 0px e quindi centrare la mappa significherebbe posizionare una singola tessera a (0,0).

ho provato la soluzione di innescare l'evento resize

google.maps.event.trigger(map, 'resize'); 

e che quasi ha funzionato - è riempito la div con piastrelle, ma è stato comunque centrato a (0,0).

Quello che ha funzionato è stato quello di inserire il codice ri-centro in una $timeout(). Ciò garantisce che il div sia completamente caricato e dimensionato correttamente prima dell'esecuzione del codice. Ora funziona perfettamente.

$timeout(function() { 
    // still need this. 
    google.maps.event.trigger(map, 'resize'); 
    map.setCenter(53, -6); 
}); 
+0

+1, buuuuut - è un timer una buona idea? Troppo breve e non funzionerà. Troppo lungo e l'utente vede una strana mappa per un po '. Sarebbe meglio farlo in base a un evento. Altre semplici risposte JS suggeriscono 'google.maps.event.addListener (mappa," idle ", function() ../' ma sono troppo n00b per tradurre questo in angolare – Mawg

+0

@Mawg con un normale timer Sono d'accordo con voi, ma la funzione $ timeout in angolare funziona in modo leggermente diverso quando viene chiamata con un timeout pari a zero o null. Esegue la funzione nel prossimo "tick" del codice angolare - il prima possibile dopo il set di codice attualmente in esecuzione. Di solito uso questo per ritardare il codice in esecuzione fino a quando non è stata completata la visualizzazione. (Sono aperto alla correzione sulla mia interpretazione di questo!) –

Problemi correlati