2016-08-02 23 views
0

Meine eckige Direktive ist über Openlayers Kartenanwendung.Angularjs Direktive Vorlage Bindung für Openlayers funktioniert nicht

<div ng-app="app"> 
    <map-container></map-container> 
</div> 

Angular Working code is here:

angular.module("app",[]); 

angular.module("app").controller("MapContainerController", function ($scope) { 
    $scope.map = new ol.Map({}); 
}); 

angular.module("app").directive("mapContainer", function ($timeout) { 
    return { 
     "transclude": true, 
     "controller": "MapContainerController", 
     "link": function (scope) { 
      var map = scope.map; 
      map.setTarget(scope.targetElement || "map"); 
      map.addLayer(new ol.layer.Tile({ 
       source: new ol.source.OSM() 
      })); 
      map.setView(new ol.View({ 
       zoom: 3, 
       center: [0, 0] 
      })); 
     }, 
     "template": '<div id="map" class="map" ng-transclude></div>' 
    } 
}); 

Aber ich möchte, wie Code Geltungsbereich Parameter für Richtlinie Kartenelementname verwenden: demo version is here.

<div ng-app="app"> 
    <map-container target-element="map"></map-container> 
</div> 

Aber das funktioniert nicht.

angular.module("app").directive("mapContainer", function ($timeout) { 
    return { 
     "transclude": true, 
     "scope": { 
      "targetElement": "@" 
     }, 
     "controller": "MapContainerController", 
     "link": function (scope) { 
      var map = scope.map; 
      map.setTarget(scope.targetElement || "map"); 
      map.addLayer(new ol.layer.Tile({ 
       source: new ol.source.OSM() 
      })); 
      map.setView(new ol.View({ 
       zoom: 3, 
       center: [0, 0] 
      })); 
     }, 
     "template": '<div id="{{targetElement}}" class="map" ng-transclude></div>' 
    } 
}); 

Alles sieht gut aus, aber es funktioniert nicht. Ich konnte das Problem nicht verstehen.

Antwort

-1

Sie müssen nur Ihre Anweisung Code in $ Timeout, so dass die Vorlage mit ID angezeigt wird, vor dem Erstellen der Karte.

angular.module("app").directive("mapContainer", function ($timeout) { 
    return { 
     "transclude": true, 
     "scope": { 
      "targetElement": "@" 
     }, 
     "controller": "MapContainerController", 
     "link": function (scope) { 
      var map = scope.map; 

      $timeout(function() { 
       map.setTarget(scope.targetElement || "map"); 
       map.addLayer(new ol.layer.Tile({ 
        source: new ol.source.OSM() 
       })); 
       map.setView(new ol.View({ 
        zoom: 3, 
        center: [0, 0] 
       })); 

      }); 
        }, 
     "template": '<div id="{{targetElement}}" class="map" ng-transclude></div>' 
    } 
}); 
+0

I bestanden Zielelement-Attribut https://jsfiddle.net/barteloma/ywo20y2L/1/ – barteloma

+0

und ich tat es auch und es funktioniert, können Sie es 'div' https siehe Protokoll: // jsfiddle. net/y68v64xw/ – Gatsbill

+0

Konsole protokolliert das Ergebnis, das Sie richtig haben, aber die Karte wird nicht angezeigt. Dies zeigt Karte: https://jsfiddle.net/barteloma/ywo20y2L/ Aber das zeigt nicht die Karte: https://jsfiddle.net/barteloma/ywo20y2L/1/ – barteloma