AngularJS - 在 ng-if 之后将元素带回 DOM

AngularJS - bring back element to DOM after ng-if

当代码试图访问 DOM 中的一个元素时,我遇到了问题,该元素之前被 ng-if

删除了

该视图的代码如下:

<div class="col-md-9" id="map-container" ng-if="searchCount<=5000">
    <div class="col-md-12" id="map_canvas" >
    </div>
</div>
<div class="cener-btn-container"  ng-if="searchCount>5000"></div>

和一个控制器部分,其效果看起来像

    $scope.searchCount = $scope.searchList.length;
    $log.debug("Ready to load map");
    $scope.loadMap();       

     $scope.loadMap=function(){
        var latlng = new google.maps.LatLng(39.774769, -101.414795)
        $scope.customList=[];
        var map_options = {
            center: latlng,
            zoom: 6,
            mapTypeId: google.maps.MapTypeId.ROADMAP,
            disableDefaultUI: true,
            zoomControl: true
        };

        google_map = new google.maps.Map(document.getElementById("map_canvas"), map_options);
        ...
        $log.debug("Map lodaded");

    }

在达到 searchCount 超过 5000 个结果并优化搜索查询以降低数量后,它会抛出错误

TypeError: Cannot read property 'firstChild' of null
    at Object._.ug (js?sensor=false:85)
    at new zg (js?sensor=false:87)
    at r.$scope.loadMap (controller.js:208)
    at controller.js:151
    at angular-resource.js:643
    at angular.js:14792
    at r.$eval (angular.js:16052)
    at r.$digest (angular.js:15870)
    at r.$apply (angular.js:16160)
    at g (angular.js:10589)

第 208 行是

google_map = new google.maps.Map(document.getElementById("map_canvas"), map_options);

map_canvasng-if 从之前的 DOM 中获取时,因为有超过 5000 个结果。

我的问题是如何在执行 loadMap() 之前取回 map_canvas

问题是无法知道 angular 是否已完成摘要循环,确保所有元素都已呈现。

要解决这个问题,有两种选择

  1. 在指令中包装一个回调函数。将该指令包含在 ng-if 中。并仅当您希望执行回调时才使该表达式为真。像

    <div ng-if="sectionActivated"> <div ng-init="callBack()"></div> </div>

  2. 在里面调用一个回调函数,setTimeOut(function(){ ... }, 0);因为浏览器默认把所有的事件放在一个队列中,所以当digest loop是运行的时候,你的回调函数会进入摘要循环结束后立即排队并执行。

在我的例子中,首选解决方案是 setTimeout,允许我做一些不属于页面地图的部分或仅限于 ng-if.[=15= 内的事情]