我正在使用D3和Angular处理地图应用程序,我遇到一个问题,即通过点击事件在模板中显示范围值。
我的指示:
angular.module("maineMap")
.directive("ngMap", ["appConfig", function(config){
function countyClickHandler(d, i, scope){
scope.currentCounty(d.properties.fips);
console.log(scope.countySelection);
}
function initMap() {
//.... other code
g.append("g")
.attr("class", "counties")
.selectAll("path")
.data(scope.mapData.features)
.enter()
.append("path")
.attr("d", path)
.attr("class", function(d){
return d.properties.name;
})
.on("click", function(d, i){
countyClickHandler(d, i, scope);
});
}
return {
restrict : "E",
link : function(scope, el, attrs){
initMap(scope, el);
}
};
}]);
我的控制器:
angular.module("maineMap")
.controller('MapCtrl', ['$scope','MapService', function($scope, MapService){
//execute data fetches via promises on template load
$scope.mapData = MapService.getMapPaths().getData();
$scope.cityData = MapService.getCityPositions().getData();
$scope.countyData = MapService.getMapData().getData();
$scope.countySelection = {};
$scope.currentCounty = function(fips){
$scope.countySelection = getCountyData($scope, fips);
console.log($scope.countySelection);
};
}]);
//helper function to extract data from external JSON file
function getCountyData($scope, fips){
for(var i = 0; i < $scope.countyData.properties.length; i++) {
if ($scope.countyData.properties[i].FIPS === fips){
return $scope.countyData.properties[i];
}
}
}
因此,当前行为的click
事件绑定到指令中绘制的路径。控制器有一个绑定到范围的函数,该范围执行辅助函数以获取相关数据。
console.log()
语句按预期打印出来,控制器方法首先显示,然后是指令调用第二。所以我知道这些值在范围内是可见的。但是,使用此模板,它们根本不显示:
<ng-map>
<div id = "countyData">
County: <span class = "countyDataPoint"> {{countySelection}}</span>
2000 Population: <span class = "countyDataPoint"> {{countySelection.POP2000}}</span>
</div>
</ng-map>
countyData
div的唯一输出是County元素的一对空{}
。 countySelection.POP2000
是空的。
鉴于此布局,如何通过click
事件使用范围值更新模板?
答案 0 :(得分:1)
解决方案是在点击处理程序中使用$apply
:
function countyClickHandler(d, i, scope){
scope.$apply(function(){
scope.currentCounty(d.properties.fips);
});
}