Angular + D3 - Получить значения области для отображения в шаблоне из события щелчка
Я работаю над картографическим приложением, использующим 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()
операторы распечатываются, как и ожидалось, сначала отображается метод контроллера, а затем директива call. Так что я знаю, что эти значения видны в области видимости. Однако с этим шаблоном они вообще не отображаются:
<ng-map>
<div id = "countyData">
County: <span class = "countyDataPoint"> {{countySelection}}</span>
2000 Population: <span class = "countyDataPoint"> {{countySelection.POP2000}}</span>
</div>
</ng-map>
Единственный выход из countyData
div - это пара пустых {}
для элемента графства. countySelection.POP2000
пустой.
Учитывая этот макет, как я могу обновить шаблон со значениями области через click
event`?
1 ответ
Решение было использовать $apply
в обработчике кликов:
function countyClickHandler(d, i, scope){
scope.$apply(function(){
scope.currentCounty(d.properties.fips);
});
}