2016-02-12 66 views
1

在AngularJS中,我的HTML模板無法識別來自我的HTML模板的id屬性。包含的HTML模板中的AngularJS id屬性

例如:

index.html文件:

<div ng-controller="SubwayMapController"> 
    <div subway-map></div> 
</div> 

scripts.js中的文件:

app.directive('subwayMap', function() { 
     return { 
      templateUrl: 'Views/subway-map.html' 
     }; 
    }); 

     map = new OpenLayers.Map("basicMap"); 
     var mapnik   = new OpenLayers.Layer.OSM(); 
     var fromProjection = new OpenLayers.Projection("EPSG:4326"); // Transform from WGS 1984 
     var toProjection = new OpenLayers.Projection("EPSG:900913"); // to Spherical Mercator Projection 
     var position  = new OpenLayers.LonLat(2.35,48.85).transform(fromProjection, toProjection); //Paris 
     var zoom   = 12; 

     map.addLayer(mapnik); 
     map.setCenter(position, zoom); 

地鐵-map.html文件:

<div id="basicMap"></div> 

當我打開索引頁面,我期待地圖從Openstreetmap顯示,但沒有任何反應。

+0

我認爲你必須在鏈接函數中使用你的地圖代碼 –

回答

3

嘗試在指令的link()函數中設置地圖。另外,它看起來像你可以使用DOMElement Map.render()而不需要一個ID。

app.directive('subwayMap', function() { 
     return { 
      templateUrl: 'Views/subway-map.html', 
      link: function(scope, element) { 
       var map   = new OpenLayers.Map(); 
       var mapnik   = new OpenLayers.Layer.OSM(); 
       var fromProjection = new OpenLayers.Projection("EPSG:4326"); 
       var toProjection = new OpenLayers.Projection("EPSG:900913"); 
       var position  = new OpenLayers.LonLat(2.35,48.85) 
             .transform(fromProjection, toProjection); 
       var zoom   = 12; 

       map.addLayer(mapnik); 
       map.setCenter(position, zoom); 
       map.render(element[0]); 
      } 
     }; 
    }); 
+0

我在該指令的'link()'函數中設置了映射。我得到一個Angular錯誤'this.div.appendChild不是一個函數'和一個Openstreetmap錯誤this.div.style是未定義的。 – Johnrednex

+1

你將不得不一起玩一下,沒有小提琴和所有。可能你需要使用'element [0]'。更新。 – Malk

+0

好吧,我嘗試'元素[0]',我沒有更多的錯誤。但地圖不顯示。我會稍微玩一下。 – Johnrednex

0

在setTimeout中放置地圖訪問碼。您正嘗試立即訪問地圖。角度還沒有完成地圖渲染,所以setTimeout是解決方案。

$timeout(function(){ 
     map = new OpenLayers.Map("basicMap"); 
      var mapnik   = new OpenLayers.Layer.OSM(); 
      var fromProjection = new OpenLayers.Projection("EPSG:4326"); // Transform from WGS 1984 
      var toProjection = new OpenLayers.Projection("EPSG:900913"); // to Spherical Mercator Projection 
      var position  = new OpenLayers.LonLat(2.35,48.85).transform(fromProjection, toProjection); //Paris 
      var zoom   = 12; 

      map.addLayer(mapnik); 
      map.setCenter(position, zoom); 
    },10); 
+0

更好地使用Angular的'$ timeout',而不是'setTimeout'。沒有必要等待半秒鐘;一個零持續時間的'$ timeout'足以將這段代碼推遲到下一個摘要循環。 –

+0

我是否也將這個'$ timeout'放入了我的閉包函數中? '(function(){...})();' – Johnrednex

+0

爲什麼在使用'ng-onload =「renderMap()時使用'$ timeout'''看起來任意超時都是一種脆弱的方法。 – taystack