$ http.get到同步AngularJS

时间:2016-03-15 22:57:29

标签: javascript angularjs asynchronous ngtable

你能帮我解决一下我在angularJS的新篇章,

我遇到了Asynchrounous $ http.get的问题,我解释说:我得到了我在ngTable中显示的数据,但是在我的html中,我有一个空表,直到我点击过滤或排序然后我看到我的数据。

我认为是因为我在http.get中有一个承诺。在这里我的代码了解更多(对不起我的英语)

'use strict';
(function() {
    angular
        .module('timeShareApp')
        .controller('homeController', homeController);


    function homeController($http, $scope, $filter, NgTableParams) {

    $scope.users =[];

$http.get('/api/users/').success(function(response) {
            $scope.users = response;

        });

       $scope.usersTable = new NgTableParams({
                page: 1,
                count: 10
            }, {
                total: $scope.users.length, 
                getData: function ($defer, params) {
                      $scope.data = params.sorting() ? $filter('orderBy')($scope.users, params.orderBy()) : $scope.users;
                       $scope.data = params.filter() ? $filter('filter')($scope.data, params.filter()) : $scope.data;
                       $scope.data = $scope.data.slice((params.page() - 1) * params.count(), params.page() * params.count());
                       $defer.resolve($scope.data);
                }
            });





 }

   homeController.$inject = ["$http", "$scope", "$filter", "NgTableParams"];

})();

获取信息:代码完美无缺,但承诺我想转换为同步,如果你能帮助我的话。

提前谢谢

2 个答案:

答案 0 :(得分:2)

我认为将$scope.usersTable添加到我的promise resolve方法中定义的问题上没有问题。你试过了吗?

答案 1 :(得分:2)

在大多数情况下,没有理由将任何数据保留在ng-table的范围之外。我的建议是不要修改或引用任何范围变量,因为这可能会导致很难跟踪时序问题。

查看非常好的ng-table文档,其中大部分都有针对您的用例的工作示例。 See the docs here

根据您的过滤/排序发生的位置,您需要对此进行调整,但以下内容基本上应该有效:

$scope.loadData = function() { return $http.get('/api/users/') };

$scope.usersTable = new NgTableParams(
  {
    page: 1,
    count: 10
  }, {
    total: 0, // just the inital value - will be updated later on
    getData: function ($defer, params) {
      $scope.loadData().success(function (result) {
        // assuming your result has a total and a data field...

        // update the table params with the total amount of results
        // could also be result.length...
        params.total(result.total);

        // sort and filter your data using the params object here
        var data = result.data;

        // give back the control to the table
        $defer.resolve(data);
      });
    }
  }
);

请注意,只要您的服务器响应,也会设置params.total。否则,分页将不可见。