2013-04-12 93 views
1

內部我的角度控制器我有以下方法定義AngularJS數據綁定和jQuery承諾

$scope.searchListing = function() { 
    $http({ 
     url: App.Url.to('listing/feed/21312') 
    }).success(function(data, status, headers, config) { 
     $scope.data = data; 
    }); 
} 

在視圖中,$ scope.data.listing環繞

<div class="item" ng-repeat="property in data.listings"><!-- stuff --></div> 

searchListing使用NG-觸發點擊和事情完美的作品。不過,我有一個單獨的API處理對我的應用程序的API調用,它基於jQuery。在我的基於jQuery的API集成之後

$scope.searchListing = function() { 
    App.Listing.getListing().done(function(data){ 
     $scope.data = data; 
    }); 
} 

API返回jqXHR對象,所以我可以調用它們的promise方法。問題是即使數據被分配到$ scope.data我的視圖沒有得到更新。 Ajax請求完成後我訪問控制器檢查,如果數據得到了分配

angular.element('[ng-controller=listingController]').scope().data 

而且它確實顯示出數據,爲什麼不看法得到更新?

+0

有采用了棱角分明'$ http'或'$ resource'因爲範圍已接受承諾 – charlietfl

回答

2

當角度模型($scope)中的數據發生變化時,Angular會識別該變化並觸發一個摘要循環,該循環會使用更新的數據重新呈現視圖。

但是,當此數據更改發生在Angular視口之外的回調中時,Angular無法監視此更改。這發生在你的情況下,數據變化發生在jQuery承諾中,而這並不屬於Angular。在這種情況下,您需要手動觸發這樣的消化循環:

App.Listing.getListing().done(function(data){ 
     $scope.data = data; 

     // make sure your app is not currently in a digest loop 
     if (!$scope.$$phase) 
      $scope.$apply(); // trigger digest loop 
}); 
+0

感謝您輕鬆不少時間!邊的問題,在控制器內使用這種API是否是一種好的做法?還是應該創建一個抽象事物的服務? –

+0

您應該爲此創建Angular服務。這就是說,他們存在,這樣,你不必擔心觸發摘要循環。另外,沒有理由將你的Angular應用緊緊地綁定到jQuery。 – xbonez

+0

不幸的是,jQuery的一部分是已經建立的一些東西,所以我必須堅持這一點,我試圖創建一個服務http://pastie.org/7468663並結束了相同的結果,我仍然要觸發摘要循環? –