Angular $ http.get有动态路由吗?

时间:2014-04-02 14:36:40

标签: javascript ajax angularjs

我对angular非常陌生,我试图了解如何使用范围变量从REST API进行查询,以确定在get请求中提取的URI。

让我说我在我的app.controller中,并且它有一个服务,它会发出一系列数字..为了使代码最小化,我将跳到重要的部分:

$scope.currentCompanyId = '0001';

$http.get('/api/'+ $scope.currentCompanyId +'/c').
  success(function(data, status, headers, config) {
    $scope.cData = data;
  }).
  error(function(data, status, headers, config) {
    // log error
  });

我知道这是作弊,因为$ http.get在控制器中。我知道它需要是某种类型的工厂..但我不知道如何将$ scope.currentCompanyID传递给get请求并让它返回JSON。此外,如果$ scope.currentCompanyID要更改为另一个数字,请说...' 0002' .. $ scope.cData如何更改以反映新查询?

5 个答案:

答案 0 :(得分:3)

我不认为在你的控制器中使用$ http是作弊 - 将它放入工厂/服务的一个原因是它可以重复使用。如果您只是在一个地方进行,那么服务不会增加太多。

话虽这么说,您的服务可以返回一个带参数的函数:

app.factory("service", function($http) {
     return {
          getCompany: function(companyId) { ...make $http call and return data... }
     }
});

然后在你的控制器中:

service.getCompany($scope.currentComanyId).then(function(resp) {...})

答案 1 :(得分:2)

您应该考虑使用Angular $resource,因为它会处理很多抽象。无论哪种方式,如果您想根据范围变量的变化发出新请求,您可以$watch

$scope.$watch('currentCompanyId', function() {
    if(!$scope.currentCompanyId) return;

    $http.get().success(); // replace with whatever mechanism you use to request data
});

答案 2 :(得分:0)

如果当前公司ID发生变化,您的请求将无法启动...您需要手动启动您的请求。

否则,它似乎是正确的

答案 3 :(得分:0)

你看过$ resource服务吗? http://docs.angularjs.org/api/ngResource/service/ $资源 - 这是一种非常方便的REST请求方式,而且docs有很多适合你的例子

关于更改$ scope.currentCompanyID - 您似乎需要为此案例创建监视:

scope.$watch('currentCompanyID', function(newValue, oldValue) {
      // do your update here, assigning $scope.cData with the value returned
      // using your code:
      $http.get('/api/'+ $scope.currentCompanyId +'/c').
         success(function(data, status, headers, config) {
            $scope.cData = data;
        }).
      error(function(data, status, headers, config) {
         // log error
         });
      });

答案 4 :(得分:0)

您只需在调用服务时传入数据。在您的控制器中,您需要将您的服务作为DI模块包含在内并按如下方式处理:

window.angular.module('myControllerModule', [])
     .controller('myController', ['$scope', 'myHTTPService', 
     function($scope, myHTTPService){
          $scope.currentCompanyId = 1;
          $scope.lookupPromise = myHTTPService.get($scope.currentCompanyId);
          $scope.lookupPromise.then(function(data){
               //things to do when the call is successful
          },function(data){
               //things to do when the call fails
          });
     }]);

在您的服务中,您可以像这样处理该值:

window.angualr.module('myHTTPServiceModule', [])
     .factory('myHTTPService', '$http',
     function($http){

     function callHTTP(url){
          return $http.get('/api/' + url + '/c');
     }

     return {
          get: callHTTP
     };
});