2015-04-27 9 views
5

Używam ngMap w aplikacji angularjs. Występuje błąd podczas próby ustawienia powiększenia elementu mapy. Oto komunikat z konsoli Chrome:ng-map: Nie można odczytać właściwości 'apply' z undefined podczas ustawiania poziomu powiększenia

TypeError: Cannot read property 'apply' of undefined 
    at Wk.eventFunc (ng-map.js:205) 
    at Object.T.trigger (main.js:18) 
    at kf (main.js:22) 
    at Wk.N.set (main.js:21) 
    at Wk.setZoom (main.js:29) 
    at ng-map.js:1568 
    at angular.js:6837 
    at forEach (angular.js:323) 
    at Object.$get.Attributes.$set (angular.js:6835) 
    at interpolateFnWatchAction (angular.js:8157) 

ten jest wyzwalany, gdy atrybut zoom mojej mapie elementu:

<map center="{{initCenter.lat}}, {{initCenter.lng}}" zoom="{{zoom}}" on-dragend="dragend()" on-zoom_changed="zoomchanged()"> 

jest związana z moim kątowej regulatora:

app.controller("mapCtrl", function ($scope, $location, dataContext) { 
    $scope.markers = []; 

    $scope.initCenter = dataContext.center(); 
    $scope.zoom = dataContext.zoom(); 

dataContext to usługa, która udostępnia różne zmienne stanu w aplikacji. Próbowałem również ustawienie $ scope.zoom za pomocą funkcji, z tym samym wynikiem błędu.

Błąd odbywa się na linii 1568 pliku ng-map.js:

var observeAndSet = function(attrs, attrName, object) { 
    attrs.$observe(attrName, function(val) { 
    if (val) { 
     void 0; 
     var setMethod = parser.camelCase('set-'+attrName); 
     var optionValue = parser.toOptionValue(val, {key: attrName}); 
     void 0; 
     if (object[setMethod]) { //if set method does exist 
     /* if an location is being observed */ 
     if (attrName.match(/center|position/) && 
      typeof optionValue == 'string') { 
      _this.getGeoLocation(optionValue).then(function(latlng) { 
      object[setMethod](latlng); 
      }); 
     } else { 
      // this is the line that causes the problem 
      object[setMethod](optionValue); 
     } 
     } 
    } 
    }); 
}; 

W próbuje prześledzić poprzez co się dzieje I następnie wykonanie do ustawiania centrum i do ustawienia zoomu (centrum ustawienie robi” przyczyną problemu). Ustawienie centrum wykonuje linię 1568 i kontynuuje swoją wesołą drogę.

ustawienie powiększenia (poprzez funkcję setzoom) powoduje, że kod na linii 196 w NG-map.js wykonać:

 var eventFunc = function(attrValue) { 
    var matches = attrValue.match(/([^\(]+)\(([^\)]*)\)/); 
    var funcName = matches[1]; 
    var argsStr = matches[2].replace(/event[ ,]*/,''); //remove string 'event' 

    var args = scope.$eval("["+argsStr+"]"); 
    return function(event) { 
     function index(obj,i) {return obj[i];} 
     var f = funcName.split('.').reduce(index, scope); 
     // this next line causes an exception in google map main.js 
     f.apply(this, [event].concat(args)); 
     scope.$apply(); 
    } 
    } 

Linia 205 prowadzi do wyjątku, który prowadzi do błędu wewnątrz Google Map za main.js plik.

Jakiś pomysł, co to powoduje? A jak go rozwiązać :)?

Możliwe rozwiązanie

zabawy z tym nieco więcej zauważyłem, że to nie jest ustawienie poziomu powiększenia per se, który powoduje ten problem. Jest to efekt wyzwolenia powiększonego wydarzenia >> po < < zoom zostanie zmieniony.

Pierwszy raz zoom jest ustawiony na mapie, linia 204:

var f = funcName.split('.').reduce(index, scope); 

ma wartość null. Nie jestem pewien, dlaczego tak jest, ponieważ nie rozumiem, co robi ta linia.

Przyszłe zmiany w powiększeniu mają jednak ten sam wiersz 204, który przyjmuje wartość inną niż null dla f.

Tak, jak obejść ten problem, ja nawias linie 205 i 206 tak:

if (f != null) { 
     f.apply(this, [event].concat(args)); 
     scope.$apply(); 
    } 

a błąd odszedł.

Odpowiedz

Powiązane problemy