Angularjs Ui路由器上解析函数的错误计时或顺序

Angularjs Ui路由器上解析函数的错误计时或顺序,angularjs,arrays,angular-ui-router,Angularjs,Arrays,Angular Ui Router,我有一个应用程序,我的主状态进行解析,进行http调用并获取数组 然后,子数组应该显示这个数组中的一个对象,但是似乎控制器中的变量定义得太早,没有得到正确的更新,所以子数组是空的 我在没有http调用的情况下尝试过它(var-array=[array]),它工作得很好,但不适合http调用 关于如何解决这个问题有什么建议吗 以下是控制器: .controller('appCtrl',['$scope', 'SearchService','fair', function($scope, Searc

我有一个应用程序,我的主状态进行解析,进行http调用并获取数组

然后,子数组应该显示这个数组中的一个对象,但是似乎控制器中的变量定义得太早,没有得到正确的更新,所以子数组是空的

我在没有http调用的情况下尝试过它(
var-array=[array]
),它工作得很好,但不适合http调用

关于如何解决这个问题有什么建议吗

以下是控制器:

.controller('appCtrl',['$scope', 'SearchService','fair', function($scope, SearchService, fair){

  $scope.data = SearchService;
  $scope.datafairs = $scope.data.flatexhibitors;
  console.log($scope.datafairs);
}])

.controller('ChildController',['$scope', 'exhibitor', '$filter', function($scope, exhibitor, $filter){

  $scope.$watch(function() { return $scope.fair; }, function(newVal) { 
    $scope.fairs = newVal;
    console.log($scope.fairs);
    $scope.chosenexhibitor = $filter("filter")($scope.fairs, {'slug':exhibitor}, true);
  }, true);


}])
服务:

.factory("SearchService", function($http) {  

  var service = {
    flatexhibitors : [],
    datafairs : [],
    getAllExhibitors : function (wop) {
      var searchindex = wop;
        console.log(searchindex);
        var url = '../register/backend/databaseconnect/getexhibitors.php';
        var config = {
            params: {
                search: searchindex
            },
            cache:true
        };
        $http.get(url, config).then(function (data) {
          service.datafairs = data.data.rows;
          for (var i in service.datafairs) {
            service.flatexhibitors.push(service.datafairs[i].doc);
          };
          return service.flatexhibitors;
        });
    }   
  }
  return service;

})
各国:

.config(function($stateProvider) {


  $stateProvider.state('berliner', {
    url: '/berlinerliste',
    params : {search: 'Berliner 2017'},
    resolve: {
      fair: function(SearchService, $stateParams) {
        return SearchService.getAllExhibitors($stateParams.search);
      }
    },
    views: {
      'header': {   
        templateUrl: 'header.htm'   
      },
      'main':{    
        templateUrl: 'bl2017.htm',
        controller: 'appCtrl'
      }    
    }
  })

  .state('berliner.exhibitor', {
    url: '/{id}', 
    resolve: {
      exhibitor: function($stateParams) {
        var slug = $stateParams.id;
        return slug;
      }
    },
    views: {
      'header': {   
        templateUrl: 'header.htm'   
      },
      'wop':{    
        templateUrl: 'exhibitor.htm',
        controller: 'ChildController'
      }    
    }
  })

})

我成功地在一个中复制了该问题。

更改
getAllExhibitors
以返回一个
承诺,如下所示:

getAllExhibitors : function (wop) {
  var searchindex = wop;
    console.log(searchindex);
    var url = '../register/backend/databaseconnect/getexhibitors.php';
    var config = {
        params: {
            search: searchindex
        },
        cache:true
    };
    return $http.get(url, config).then(function (data) {
      service.datafairs = data.data.rows;
      for (var i in service.datafairs) {
        service.flatexhibitors.push(service.datafairs[i].doc);
      };
      return service.flatexhibitors;
    });
}

这是一个反模式。。。见:谢谢你的评论。只有在解析响应之前没有对响应执行聚合/转换逻辑时,它才是反模式。例如,如果在上面的代码中,我们在成功时立即解析了响应,而没有对响应执行任何计算,那么它可能被视为反模式,并被$http调用的简单返回所取代。但是,在本例中,我们有循环逻辑,需要在解决响应之前对其执行循环逻辑。这就保证了使用$q.defer()的必要性。不,它不是。可以以同样的方式在
then()
中轻松操作,只需执行
退货服务即可。在这种情况下,不需要额外的延迟,它显然符合反模式,请记住,
then()
本身也会返回一个promiseI,包括在我的应用程序中,它工作完美,谢谢大家@代码战士