设置动态$ http.get请求(Angular)

时间:2016-05-02 16:46:54

标签: angularjs api http dynamic get

我想知道如何动态更改$ http调用,以便$ http请求URL根据在ng-repeat列表中单击的元素而有所不同。但是我被困住了。

目前,我在索引页面上设置了ng-repeat:

<div ng-repeat="team in nt.getStandings">
    <a href="#/nation-details/{{team.team_id}}"><h2>{{team.team_name}}</h2></a>
    <p>Team ID = {{team.team_id}}</p>
</div>

变量getStandings是通过$ http调用从API获取的。像这样:

在StandingsService中

return $http.get(
    'http://api.com/standings/1005?Authorization=xxxx'
) 

        .success(function(data) { 
          return data; 
        }) 
        .error(function(err) { 
          return err; 
        }); 

然后StandingsService附加到我的控制器中的getStandings变量。

“1005”是一个特定阵列的属性,在这种情况下是一系列竞赛中的特定体育比赛。

因此,在我的索引页面上,我使用ng-repeat列出该竞赛中的所有团队。

正如您在上面的html中所看到的,我已经链接了每个团队,以便它动态生成一个URL,将team_id追加到最后,使用$routeParams我将其定义为变量{{ 1}}。

团队详细信息页面

whichTeam

这很好用,团队ID是根据点击的团队动态生成的。

就像上面的“StandingsService”一样,我还有另一个名为“TeamService”的服务,该服务生成$ http请求以提取团队数据。目前虽然它是静态设置来调用一个单独的团队 - 我想让服务接受whichTeam变量,以便调用根据点击的团队而变化。

这是静态团队$ http请求(我已将URL分开并连接以使其更清晰):

<h1>Dynamic Team ID = {{whichTeam}}</h1>

我希望 return $http.get( 'http://api.com/team/' + '16110' + '?Authorization=xxxx' ) 部分(引用一个团队)成为16110变量,允许它提取正确的团队数据,但我不知道如何写这(或者如果可能的话)。

我希望我已经清楚了 - 如果需要,我很乐意进一步澄清。提前谢谢。

1 个答案:

答案 0 :(得分:0)

建厂:

app.factory("DataService", ["$http", function($http) {
    return {
        getTeamDetailsById: function(teamId) {
            return $http.get('path/to/api' + teamId + '?Auth=xxxx')
        }
    };
}]);

在控制器中使用它:

app.controller("MainCtrl", ["$scope", "DataService", function($scope, DataService) {
    $scope.teamDetails = {};

    $scope.getTeamDetailsById = function(event, teamId) {
        //prevent click navigation
        event.preventDefault();

        //call factory service
        DataService.getTeamDetailsById(teamId).then(function(response) {
            //success callback
            $scope.teamDetails = response.data;
        }, function(response) {
            //an error has occurred
        });
    }
}]);

ng-repeat元素中:

<div ng-repeat="team in teams">
    <a href ng-click="getTeamDetailsById($event, team.team_id)">{{team.team_name}}</a>
</div>

以上假设您只有一个状态并且只存储在一个控制器中。如果您想使用使用$stateProvider的不同状态,那么您必须使用参数,方法是使用ui-sref并传入团队ID。

如果确实使用了$states和参数,请执行以下操作:

<a href ng-click="goToState($event, team.team_id)">{{ team.team_name }}</a>

$scope.goToState = function(e, teamId) {
    $state.go("teamDetailsState", { "teamId": teamId });
}