AngularJS 控制器返回工厂但不显示在模板中

AngluarJS controller getting returned factory but not displaying in template

我的控制器正在调用服务工厂,我看到工厂 API 成功调用并将结果返回给控制器,但是分配给控制器的模板没有渲染结果。

工厂:

.factory("clubService", function($http,$q) {
  var clubs= [] ;
  function clubsAll() {
    clubs = [] ;
    setVars() ; // function to set baseUrl/headers, etc   
    var dataObj = [{"type":1,"userID":userData.user_ID}]
    var req = {
      method: 'POST',
      url: baseUrl ,
      headers: headers,
      data: JSON.stringify(dataObj)
    }
    return $http(req)
    .then(function(response){
      clubs = response.data ;
      return clubs ;
    }).catch(function(err) {
      errMgmt("services/apiCall",700,err.code+", "+err.msg) ;
    });
  }

  return {
    all: function() {
      return clubsAll() ;
      //return clubs ;
    }
}) ;

控制器:

.controller('ClubCtrl', function($scope,$state,clubService) {

  $scope.clubs = clubService.all() ;
  console.log($scope.clubs) ;   // 'clubs' is getting populated in console.
})

在我的 HTML

   <div ng-if="clubs.length == 0">
      <img ng-src="img/loader.gif">
   </div>
   <div ng-if="clubs.length > 0">
      <div ng-repeat="club in clubs">
         {{club.Name}}
      </div>
   </div>

但是我的 HTML 中没有任何内容被渲染,任何引用 clubs 的内容都没有显示,ng-if 仍然被注释掉,没有 ng-repeat 显示。

我明白了,我需要等待控制器中 return 的承诺。

.controller('ClubCtrl', function($scope,$state,clubService) {

  clubService.all()
  .then(function(response) {
     $scope.clubs = response ;
     console.log($scope.clubs) ;   // 'clubs' is getting populated in console.
   }) ;
})

在 clubService, clubsAll() 方法中,当你声明这一行时,你实际上是在返回一个承诺

return $http(req)
    .then(function(response){
      clubs = response.data ;
      return clubs ;
    }).catch(function(err) {
      errMgmt("services/apiCall",700,err.code+", "+err.msg) ;
    });

该承诺可以被解决(成功)或被拒绝(错误),如果您想从该承诺中获取俱乐部数据,您需要 将控制器逻辑链接到承诺成功回调 (.then)

.controller('ClubCtrl', function($scope,$state,clubService) {

    clubService.all().then(function(response){
        $scope.clubs = response;
    });
})