2013-05-02 7 views
6

Praca na aplikacji Google Map zbudowanej za pomocą AngularJS.Dlaczego nie wszystkie kafelki mapy Google są renderowane przy pierwszym załadowaniu aplikacji AngularJS?

Obecnie wdrażane piaskownicy: http://of.xchg.com/

kliknij link Mapa i można zauważyć tylko jeden żeton JEŚLI są renderowane.

Jeśli następnie ZMINIMALIZUJ okno przeglądarki, TO resztę kafelków mapy wyrenderuje całkowicie.

Oto projekt git: https://github.com/LarryEitel/of4

Dlaczego nie wszystkie Google Mapa Płytki renderowane?

Czy istnieje sposób na sprawdzenie kompletnego renderowania płytek?

Czy istnieje sposób na wymuszenie ponownego renderowania wszystkich kafelków mapy?

Odpowiedz

0

Po wielu próbach i błędach znalazłem obejście. Przez samo wstrzyknięcie usługi GoogleMap do polecenia uruchomienia aplikacji, udało się uzyskać kompletną mapę. TAKŻE musiałem ustawić domyślną trasę "/" na stronie mapy. Cokolwiek innego, co zrobię, polegające na przełączeniu się ze strony domowej (bez mapy) na stronę mapy, spowoduje częściowo renderowaną mapę. :(

Może ja lub ktoś zaproponować bardziej eleganckie rozwiązanie. :)

// 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

Zapytałem o pokrewne pytanie [tutaj] (http://stackoverflow.com/questions/16444095/google-map-render-events-can-they-be-watched) i @varun wskazał mi dobrą [sugestię] (http://stackoverflow.com/questions/7341769/google-maps-v3-how-to-tell-when-an-imagemaptype-overlays-tiles-are-finished-lo/7355063#7355063). –

+0

Po prostu ciekawy - dlaczego spadł? – Mawg

13

wywołać tę funkcję w kontrolerze mapy:

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

To powinno załatwić sprawę.

+0

Dziękuję za odpowiedź. Drobne szczegóły mówią, że w celu zachowania stanu mapy, wstrzyknęłam GoogleMap jako usługę do głównego kontrolera. Następnie pokazuję/chowam w razie potrzeby. Początkowy widok ma ukrytą mapę. Najlepiej byłoby wprowadzić wstrzykniętą mapę do MainController tylko NA PIERWSZY "pokaz" mapy. Oto link do kodu do tej pory: http://goo.gl/8ClMo –

+0

Widzę, że w twoim kodzie (w app.js) ustawiasz MainCtrl jako kontroler nawet dla views/map.html. Jeśli zmienisz to na MapCtrl, myślę, że to powinno dać ci pożądany rozdział obaw, których szukasz.Następnie wystarczy wprowadzić usługę Google Map do kontrolera mapy i wywołać ten parametr zmiany rozmiaru w tym kontrolerze zamiast MainCtrl. – jesal

+0

Wprowadzono sugerowaną zmianę z tym samym zachowaniem. Interesujące jest to, że jeśli wykonuję intensywne odświeżanie na/#/map, otrzymuję NIE mapę ... nawet po zmianie rozmiaru przeglądarki. –

2

znalazłem ten problem, gdy próbuje ponownie wyśrodkować mapę po widoku załadowany. W lewym górnym rogu znajduje się pojedynczy kafelek.

Zauważyłem, że wycentrował on mapę na wysokości div (0,0) i uznałem, że musi ona mierzyć div, zanim była widoczna. Oznaczałoby to, że wymiary wynosiły 0px, 0px, a zatem wyśrodkowanie mapy oznaczałoby umieszczenie pojedynczej płytki w punkcie (0,0).

Próbowałem rozwiązanie wyzwalania zdarzenie Resize

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

i że prawie pracował - napełnił div z płytek, ale to wciąż było skupione w (0,0).

Co pracowało, aby owinąć ponownie kod centrum w $timeout(). To gwarantuje, że kod div jest w pełni załadowany i ma prawidłowe wymiary przed uruchomieniem kodu. Teraz działa idealnie.

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

+1, buuuuut - czy timer jest dobrym pomysłem? Zbyt krótki i nie zadziała. Zbyt długo i użytkownik widzi przez jakiś czas dziwną mapę. Byłoby lepiej zrobić to na podstawie zdarzenia. Inne proste odpowiedzi JS sugerują 'google.maps.event.addListener (map," idle ", function() ../' ale jestem zbyt n00b aby przetłumaczyć to na kątowy – Mawg

+0

@Mawg ze zwykłym timerem Zgadzam się z ty, ale funkcja $ timeout w kanciastym działa trochę inaczej po wywołaniu z zerowym lub zerowym limitem czasu, uruchamia funkcję w następnym "tik" kodu kątowego - tak szybko jak to możliwe po aktualnie uruchomionym zbiorze kodu. Zwykle używam tego, aby opóźnić uruchamianie kodu do momentu zakończenia widoku. (Jestem otwarty na korektę mojej interpretacji tego!) –

Powiązane problemy