使用Angular表达式绑定Ajax调用的无限循环

时间:2014-03-28 15:15:14

标签: javascript ajax angularjs angularjs-scope

我正在开发一个读取Feed的基本Angular应用程序。

我在index.html中返回控制器点击此按钮的值

<button ng-click="loadFeed()">Load News</button>

问题在于我是否尝试这样做:

{{loadFeed()}}

它进入一个不定式循环。

Controllers.js:

myApp.controller("FeedCtrl", ['$scope','FeedService', function ($scope,Feed) {    
$scope.feedSrc = "http://rss.cnn.com/rss/cnn_topstories.rss";

$scope.loadFeed=function(){        
    Feed.parseFeed($scope.feedSrc).then(function(res){
        $scope.feeds=res.data.responseData.feed.entries;
    });

}
}]);

myApp.factory('FeedService',['$http',function($http){
return {
    parseFeed : function(url){
        return $http.jsonp('//ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=50&callback=JSON_CALLBACK&q=' + encodeURIComponent(url));
    }
}
}]);

对不起,我对AngularJS很新。我看到了另一个类似的话题,但我无法解决我的问题。

1 个答案:

答案 0 :(得分:1)

当第一个 $ digest 周期被触发时,您的{{loadFeed()}}表达式会被评估。这会产生对你的函数parseFeed的调用,它使用$ http。现在,这就是你的问题的原因,Angular在通过$ http的ajax请求中做的最后一件事就是调用 $ rootScope。$ apply()。这会触发另一个$ digest周期,这会导致你的表达式再次被评估,这会触发另一个$ rootScope。$ apply(),你已经可以在这里看到无限循环了。