2015-04-27 23 views
5

Ich verwende ngMap in einer angularjs App. Ich habe einen Fehler, wenn ich versuche, den Zoom auf ein Kartenelement zu setzen. Hier ist die Fehlermeldung aus der Chrome-Konsole:ng-map: Die Eigenschaft 'apply' von undefined kann beim Einstellen der Zoomstufe nicht gelesen werden

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) 

Diese ausgelöst wird, wenn das Zoom-Attribut meines Kartenelementes:

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

ist meinen Winkel Controller gebunden zu sein:

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

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

dataContext ist ein Dienst, der verschiedene Statusvariablen in der App verfügbar macht. Ich habe auch versucht, $ scope.zoom durch eine Funktion mit dem gleichen resultierenden Fehler zu setzen.

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); 
     } 
     } 
    } 
    }); 
}; 

Bei dem Versuch, zu verfolgen, durch das, was passiert, ich folgte die Ausführung zum Einstellen Zentrum und zur Einstellung Zoom (Einstellung Zentrum doesn‘:

Der Fehler Ort auf der Leitung 1568 der ng-map.js Datei nimmt t ein Problem verursachen). Das Setzen des Mittelpunkts führt die Zeile 1568 aus und geht auf seinem fröhlichen Weg weiter.

Einstellung Zoom (über die Funktion setZoom) bewirkt, dass Code in Zeile 196 in ng-map.js auszuführen:

 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(); 
    } 
    } 

Linie 205 führt zu einer Ausnahme, die in Google-Karte main.js im Fehler führt Datei.

Irgendeine Idee, was das verursacht? Und wie man es löst :)?

Mögliche Lösung

Herumspielen mit diesem etwas bemerkte ich, dass es nicht die Zoomstufe ist per se Einstellung, die das Problem verursacht. Es ist eigentlich das Ergebnis der zoomchanged Ereignisfeuern >> nach < < der Zoom wird geändert.

Das erste Mal Zoom wird auf der Karte gesetzt, Linie 204:

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

wertet auf null. Ich bin nicht sicher, warum das so ist, weil ich nicht verstehe, was diese Linie macht.

Die zukünftigen Änderungen an Zoom haben jedoch dieselbe Linie 204, die auf einen Nicht-Null-Wert für f auflöst.

So, wie dieses Problem zu umgehen, klammert I Linien 205 und 206 wie folgt aus:

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

und der Fehler ging weg.

Antwort

Verwandte Themen