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

Rob*_*ert 5 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>
Run Code Online (Sandbox Code Playgroud)

控制器:

    $scope.model.output = function(id) {
        console.log(id);
    }
Run Code Online (Sandbox Code Playgroud)

模型:

var Model = function() {
    this.parent = [];
};
Run Code Online (Sandbox Code Playgroud)

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

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

1
1
1
2
2
3
3
1
2
3
1
Run Code Online (Sandbox Code Playgroud)

代替:

1
2
3
Run Code Online (Sandbox Code Playgroud)

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

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

更新

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

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

ero*_*oak 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;
  });

}
Run Code Online (Sandbox Code Playgroud)

编辑:

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
     * 
     */

  });

});
Run Code Online (Sandbox Code Playgroud)