2016-02-23 35 views
1

這是我的代碼如何在angularjs中限制異步調用?

.state('appSetting', { abstract: true, url: '/appSetting/:appId', templateUrl: appUrl + '/AppSetting/Index', controller: 'AppSettingCtrl' }) 
 
.state('appSetting.majorObjectList', { url: '/majorObject', templateUrl: appUrl + '/MajorObject/List', controller: 'MajorObjectsCtrl' }) 
 

 

 
MajorObjectsCtrl = [ 
 
    '$scope', '$state', 'uiGridConstants', '$stateParams', '$rootScope', 'dataFactory', 'cacheKeys', '$window', 'ngDialog', '$filter', function ($scope, $state, uiGridConstants, $stateParams, $rootScope, dataFactory, cacheKeys, $window, ngDialog, $filter) { 
 
     "use strict"; 
 
    $scope.loadMajorObjects = function() { 
 
      $scope.getData(); 
 
      $scope.objectsList.data = $scope.filterData; 
 
     }; 
 
    
 
    }]; 
 

 

 
AppSettingCtrl = [ 
 
    '$scope', '$state', '$stateParams', '$window', '$sessionStorage', 'dataFactory', 'ngDialog', '$q', function ($scope, $state, $stateParams, $window, $sessionStorage, dataFactory, ngDialog, $q) { 
 
     "use strict"; 
 
    $scope.getData = function() { 
 

 
      var appId = $scope.currentAppId; 
 
      var type = $scope.majorObject.type; 
 
      if (_.isEmpty(appId)) { 
 
       return; 
 
      } 
 
      var deferred = $q.defer(); 
 
      // var cacheKey = { key: cacheKeys.objectTypeList($scope.asCacheOptions({ ObjectType: type })) }; 
 
      dataFactory.get("/MajorObject/All?applicationId=" + $scope.currentAppId + "&type=" + type) 
 
       .then(function (result) { 
 
        $scope.selectAppSetting('Major Objects'); 
 
        $scope.filterData = result.data.data; 
 
        deferred.resolve($scope.filterData); 
 
         
 
       }); 
 
       return deferred.promise; 
 
     }; 
 
    }];
<div ng-controller="AppSettingCtrl" class="row appReady"> 
 
      @RenderPage("_TopNavBar.cshtml") 
 
      <button id="myCheck" ng-click="showSearchPopUp()" class="btn btn-primary"><i class="fa fa-plus"> <span>Search</span> </i> </button> 
 
     </div>

在上面的代碼中調用getData()majorObjectCtrl。控制器去appSettingCtrlgetData()功能,然後立即轉移到majorObjectCtrl,下一步從appSettingCtrl加載服務的數據。但是在我從服務中加載數據後,我想要轉移到majorObjectCtrl

回答

1

您應該從getData返回承諾。然後在loadMajorObjects,你可以鏈接它.then利用$scope.filterData

這是對getData的改進。

$scope.getData = function() { 
     var appId = $scope.currentAppId; 
     var type = $scope.majorObject.type; 
     if (_.isEmpty(appId)) { 
      return $q.when(); 
     } 
     // var cacheKey = { key: cacheKeys.objectTypeList($scope.asCacheOptions({ ObjectType: type })) }; 
     dataFactory.get("/MajorObject/All?applicationId=" + $scope.currentAppId + "&type=" + type) 
      .then(function (result) { 
       $scope.selectAppSetting('Major Objects'); 
       return result.data.data; 
      }); 
    }; 

loadMajorObjects

$scope.loadMajorObjects = function() { 
     $scope.getData().then(function(filterData) { 
      $scope.objectsList.data = filterData; 
     }); 
    }; 
0
$scope.loadMajorObjects = function() { 
    $scope.getData().then(function (result) { 
     $scope.objectsList.data = result; 
    }); 
}; 
+1

解釋代碼,請! –