您可以为ng repeat中的每个Run使用单独的控制器,然后在该RunController实例中触发查找,而不是在父控制器中使用按钮和getInfo()方法。
我修改了你的Plunk以使其工作。
Here it is
.
这是新的RunController:
fastradaApp.controller('RunController', ['$scope', '$http', '$log',
function($scope, $http, $log) {
$scope.loading = false;
$scope.getInfo = function() { // note we reference $scope.run (as created by the ng-repeat loop)
console.log($scope.run);
if ($scope.run !== undefined) {
var latlng = $scope.run.latitude + "," + $scope.run.longitude;
if ($scope.run.latitude !== 0 && $scope.run.longitude !== 0) {
$http.get('http://maps.googleapis.com/maps/api/geocode/json?latlng=' + latlng)
.success(function(data, status, headers, config) {
$log.info(data);
if (data !== undefined && data.results[0] !== undefined) {
$scope.run.city = data.results[0].address_components[2].long_name;
} else {
$scope.run.city = "undefined";
}
})
.error(function(data, status, headers, config) {
// called asynchronously if an error occurs
$scope.run.city = "undefined";
});
} else {
$scope.run.city = "undefined";
}
}
};
$scope.getInfo();
}
]);
注意,没有“run”参数传递给getInfo()函数。相反,它使用$scope.run,这是ng重复循环创建的特定运行实例。
还要注意,我用一个简单的$http调用替换了复杂的请求代码。它更干净,因为它不需要真正的设置,而且您甚至不必对结果使用JSON.parse()。
我还使用$log服务添加了一些日志记录,以使其更加明显。当然,它不需要工作。
HTML保持不变:
<tr ng-repeat="run in runs" ng-controller="RunController">
<td>{{run.runId}}</td>
<td>{{run.city}}</td>
<td>{{run.time}}</td>
</tr>