2013-04-12 40 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并结束了相同的结果,我仍然要触发摘要循环? –