Привязка шаблона директивы angularjs для openlayers не работает

0

Моя угловая директива - это приложение для карт openlayers.

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

Угловой рабочий код здесь:

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

Но я хочу использовать параметр scope для имени элемента директивной карты, например, следующий код: демо-версия здесь.

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

Но это не работает.

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

Все выглядит отлично, но это не работает. Я не мог понять проблему.

Теги:
openlayers-3

1 ответ

-1

вам просто нужно обернуть свой директивный код в $ timeout, чтобы шаблон отображался с идентификатором, прежде чем создавать карту.

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
    Я передал целевой элемент-атрибут jsfiddle.net/barteloma/ywo20y2L/1
  • 0
    и я сделал это тоже, и это работает, вы можете увидеть это журнал 'div' jsfiddle.net/y68v64xw
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню