为什么我要为一个项目打多个电话?

时间:2015-06-18 13:15:49

标签: angularjs

我正在尝试拨打服务器,根据下拉列表中选择的特定ID获取项目列表。

HTML:

 <tr ng-repeat="parent in model.waivers">
    <td><select ng-model="parent.ID" ng-options="object.Key as object.Value for object in model.myObject"></select></td>
    <td><select ng-model="parent.ServiceNameID" ng-options="expectedResult.Key as expectedResult.Value for expectedResult in model.output(object.ID)"></select></td>
</tr>

控制器:

    $scope.model.output = function(id) {
        console.log(id);
    }

模型:

var Model = function() {
    this.parent = [];
};

我只是在这里登录以查看结果。我真正打算做的是根据该ID获取一个列表。

如果有3个表行,那么输出的是:

1
1
1
2
2
3
3
1
2
3
1

而不是:

1
2
3

这是我所期望的,因为每行只有一个id。

有关导致此行为的原因的任何建议?

更新

所以@Fieldset告诉我,问题是由父方法中每个项目的角度调用方法引起的。

关于如何执行此操作的任何建议,每个项目只调用一次方法?

1 个答案:

答案 0 :(得分:2)

你的代码在ng-repeat中,所以model.output(object.ID)将被调用多次,因为model.waivers中有元素。

您不能像这样向服务器提出请求,因为您的HTTP请求将是异步的并返回承诺,您无法在视图中使用承诺。您必须在控制器($ scope)中加载数据,然后您的视图才能通过$ scope访问您的数据

您必须先申请数据:

<强>控制器

function($scope, $http) {

  $scope.data = [];

  //This is asynchronous
  $http.get('my/path/to/my.data').success(function(data) {
    $scope.data = data;
  });

}

修改

angular.module('myApp', []).controller('myCtrl', function($scope, $http, $q) {

  //One request per id
  var ids = [4, 52, 65, 12, 78];
  var promises = [];

  ids.forEach(function(id) {
    promises.push($http.get('my/path/to/my.data?id='+id));
  });



  //Fill $scope.data when all requests are done
  $scope.data = [];

  $q.all(promises).then(function(data){

    $scope.data = data;

    /**
     * You get something wich looks like
     * 
     * Assuming that your webservice returns a response like {id: 4, name: 'Something'}
     * 
     * $scope.data = [
     *  {id: 4, name: 'Something'},
     *  {id: 52, name: 'Something else'},
     *  {id: 65, name: 'foo'},
     *  {id: 12, name: 'bar'},
     *  {id: 78, name: 'foobar'}
     * ];
     * 
     * So you can loop over $scope.data in your view
     * 
     */

  });

});