簡體   English   中英

在angularjs指令中獲取Div ID

[英]Getting Div id in angularjs directive

我有一個問題,在Angularjs指令中,在呈現模板之前首先調用控制器中的initialize()。 這意味着我無法檢索動態ID。

我正在嘗試為每個地圖設置不同的ID,但由於動態ID,目前導致以下代碼崩潰。

map = new google.maps.Map(document.getElementById('addressMap-' + $scope.mapId), mapOptions);

完整代碼,有什么想法嗎? 干杯

app.directive('googleMap', function ($compile) {

var mapId = 1;
var linker = function (scope, element) {
    scope.mapId = mapId++;
};

return {
    require: '^addressBasedGoogleMap',
    restrict: "EA",
    scope: {
        address: "=",
        zoom: "=",
        mapId: "="
    },
    template : '<div id="addressMap-{{::mapId}}" style="height: 200px;"></div>',
    link: linker,
    controller: function ($scope) {
        var geocoder;
        var latlng;
        var map;
        var marker;

        var initialize = function () {
            geocoder = new google.maps.Geocoder();
            latlng = new google.maps.LatLng(-34.397, 150.644);
            var mapOptions = {
                zoom: $scope.zoom,
                center: latlng,
                mapTypeId: google.maps.MapTypeId.ROADMAP
            };
            map = new google.maps.Map(document.getElementById('addressMap-' + $scope.mapId), mapOptions);
        };
        var markAdressToMap = function () {
            geocoder.geocode({ 'address': $scope.address }, function (results, status) {
                if (status == google.maps.GeocoderStatus.OK) {
                    map.setCenter(results[0].geometry.location);
                    marker = new google.maps.Marker({
                        map: map,
                        position: results[0].geometry.location
                    });
                }
            });
        };
        $scope.$watch("address", function () {
            if ($scope.address != undefined) {
                markAdressToMap();
            }
        });
        initialize();
    }
};

});

我會嘗試將initialize()推遲到$scope.mapId存在。 一種方法是:

$scope.$watch('mapId', function(oldval, newval) {
    if (!oldval && newval) {
        initialize();
    }
});

嘗試任何一種。

解決方案1:

$scope.$$postDigest(function(){
  initialize();
 });

解決方案2

$timeout(initialize)

我會做這樣的事情:

function waitForDiv() {
    var elem = document.getElementById('addressMap-' + $scope.mapId);
    if (typeof elem == 'undefined') {
        $timeout(waitForDiv, 100);
    }
}

function () {
    geocoder = new google.maps.Geocoder();
    latlng = new google.maps.LatLng(-34.397, 150.644);
    var mapOptions = {
        zoom: $scope.zoom,
        center: latlng,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    waitForDiv();
    map = new google.maps.Map(document.getElementById('addressMap-' + $scope.mapId), mapOptions);
};

一般而言,在指令和angular中,您希望在編譯或任何內容之前引用元素,並避免在事后通過id在DOM中搜索它們。

如果創建將包含地圖的元素,則可以避免$ timeout,您需要等待摘要-通過已經引用了該元素_map即可

這是一個笨蛋

var map_el = '<div id="map-{{mapId}}" class="map"></div>';

var _link = function(scope, el, attr, ctrl) {
   var _map = $compile(map_el)(scope);
   el.append(_map);
   ctrl.addMap(scope, _map);
};

var _controller = function() {
   var m = this;
   m.addMap = function(scope, _map) {
     ...
     new google.maps.Map(_map[0], mapOptions);
   }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM