2014-01-30 430 views
1

我想在函數工作時使用ajax微調,但我不知道如何告訴微調器在函數完成時隱藏。角度,如何知道什麼時候完成服務

代碼工作像這樣:

  1. 點擊一個按鈕,微調出現,並在控制器的功能被觸發更新一些數據。
  2. 該函數訪問使用$ resource更新數據的服務
  3. 無法隱藏微調器,因爲我不知道進程何時完成。

那麼,我怎麼知道整個事情什麼時候完成,所以我可以退出顯示微調?

單擊視圖中的按鈕會觸發updateData()。在我的控制,我有:

$scope.updateData = function() { 
    Data.updateData(); 
} 

在上面提到的數據業務了updateData方法是:

updateData : function() { 

      API.update({ 
       uri  : 'updateData' 
      }, { 
       data  : data 
      }, function(data) { 
       data = data[0]; 
       $rootScope.$emit('Data.updateSuccess'); 

      }, function(err) { 
       $rootScope.$emit('Data.updateError', err); 
      }); 

該API來自工廠擴展$資源:

.factory('API', ['$resource', function($resource){ 
    return $resource('/location/:uri', {}, { 
     query : { 
      method : 'GET', 
      isArray : true 
     }, 
     update: { 
      method: 'POST', 
      headers: { 
       'Content-Type': 'application/json' 
      } 
     }, 
     create: { 
      method: 'POST', 
      isArray : true, 
      headers: { 
       'Content-Type': 'application/json' 
      } 
     } 
    }); 
}]); 

} 

起初我以爲我可以聽聽那些$發射(我也試過$廣播)在控制器與

$rootScope.$on('Data.updateSuccess', $log.log('update success')); 
    $rootScope.$on('Data.updateError', $log.log('update failure')); 

但是當我做我每次都得到他們兩個。那麼在完成這個更新過程之後,我需要做些什麼來確定何時隱藏我的ajax spinner?

+0

你見過這樣的:http://stackoverflow.com/a/17850865/149060 –

+0

你或許應該返回一個承諾,而不是隻調用該函數和然後給它添加一個'.then'處理程序。 –

+0

@BenjaminGruenbaum我將如何在我必須合作的背景下做到這一點? – Lothar

回答

2

你可以使用promise來處理這個。對於承諾,請注入$ q服務。

您通過調用$ q.defer()獲得延期;

然後,你做一些異步的事情。在你的例子中,你會進行資源調用。當您從資源調用中獲取數據時,可以使用數據調用deferral.resolve。那時您也可以關閉微調器,無論是通過$ scope還是通過調用服務。

下面是一個示例服務,它模擬提取數據時延遲2秒。它向您展示瞭如何使用$ q服務。試想一下,如果你打電話給$資源,而不是$超時。

app.service("myService", function($q, $timeout) { 
    var _this = this; 
    this.$q = $q; 
    this.$timeout = $timeout; 
    var stuff = [1, 2, 3]; 
    return { 
     getStuff: function() { 
      var deferral = $q.defer(); 
      _this.$timeout(function() { 
       deferral.resolve(stuff); 
      }, 2000); 
      return deferral.promise; 
     } 
    }; 
}); 

接下來,這是一個使用promise的控制器。注意它打開微調器,然後提取數據,並在數據到達時將其關閉。再次,我通過範圍來做這件事,但你可以調用一個服務或發出一個事件,這取決於你的微調器是如何實現的。

app.controller("myController", function($scope, myService) { 
    var _this = this; 
    this.$scope = $scope; 
    this.myService = myService; 
    this.$scope.showSpinner = true; 
    this.myService.getStuff().then(function(data) { 
     _this.$scope.stuff = data; 
     _this.$scope.showSpinner = false; 
    }); 
}); 

以下是完整的工作小提琴:http://jsfiddle.net/jeremylikness/PhZYb/

1

像這樣的東西應該適合你。 $資源實例返回,您可以訪問(無需注入手動$ Q服務)承諾:

updateData: function() { 

     var Data = API.update({ ... your opts ... }); 

     // access the built-in $promise 
     Data.$promise.then(function(res){ 

      // $broadcast from $rootScope 
      $rootScope.$broadcast('Data.updateSuccess'); 

     }, function(err){ 

      $rootScope.$broadcast('Data.updateError', err); 

     }); 
    } 

與Insight從這些:

相關問題