そこで、HTML テンプレートで D3 データマップをレンダリングする Angular ディレクティブを作成しました。「data」属性を介してデータをディレクティブに渡します。私が直面している問題は、ページが初めて読み込まれたときにマップが完全に表示されることです。ただし、他のテンプレートからナビゲートしてテンプレートに戻ると (「ui-route」を介してルーティングが行われます)、マップはレンダリングされず、コンソールにもエラーはありません。これが私のディレクティブです:
app.directive('stabilityMap', function() {
var containerid = document.getElementById('world-map-container');
var margin = 20,
padding = 50,
width = containerid.offsetWidth - margin;
height = containerid.offsetHeight - margin;
return {
restrict: 'A',
scope: {
data: '=',
},
link : function(scope, element, attrs) {
scope.$watch('data', function(newVal, oldVal) {
var colorScale = d3.scale.linear().domain([50, 100]).range(['#ff0000', '#280000']);
var Fills = {defaultFill: '#ddd'};
var Data = {};
var countries = Datamap.prototype.worldTopo.objects.world.geometries;
for(var i = 0; i < newVal.length; i++) {
for (var j = 0; j < countries.length; j++) {
if(countries[j].properties.name == newVal[i].Country) {
Fills[countries[j].id] = colorScale(newVal[i]['Stability Index']);
Data[countries[j].id] = { fillKey : countries[j].id};
}
}
}
var map = new Datamap({
element: containerid,
responsive: true,
projection: 'mercator',
setProjection: function(element) {
var projection = d3.geo.mercator()
.center([0, padding])
.scale(105)
.translate([element.offsetWidth / 2, element.offsetHeight / 2 - 70]);
var path = d3.geo.path()
.projection(projection);
return {path: path, projection: projection};
},
fills: Fills,
data: Data
})
d3.select(window).on('resize', function() {
map.resize();
});
})
}
}
})
テンプレートの角度コントローラーは次のとおりです。
app.controller('CountryCtrl', ['$scope', '$http', function($scope, $http) {
$scope.countriesData = [
{'Country': 'Australia', 'Stability Index':'85'},
{'Country':'United States of America', 'Stability Index':'90'},
{'Country':'Russia', 'Stability Index':'70'},
{'Country':'India', 'Stability Index':'84.2'},
{'Country':'China', 'Stability Index':'50'}
]
}]);
HTML テンプレートは次のとおりです。
<div class="row" id="world-map">
<div stability-map data="countriesData" id="world-map-container">
</div>
</div>
ページが最初にロードされたときのスクリーンショットを次に示します。
そして、ウェブサイトの他のテンプレートから移動した後、ページに戻った後の空のコンテナ。
何が起こっているのか分かりますか?