2014-03-28 69 views
0

我正在開發一個讀取Feed的基本Angular應用程序。使用Ajax調用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。我看到了另一個類似的話題,但我無法解決我的問題。

+0

一個問題可能是loadFeed()不返回任何東西。無內容顯示。也許把{{feeds}},並在你的控制器中調用$ scope.loadFeed()來初始化數據。 –

+0

非常感謝您的回答,但我沒有感到抱歉。 feed只在loadFeed內部填充,所以我不能在調用loadFeed之前調用它,你的意思是調用$ scope.loadFeed()? – Pedro4441

+0

也許你正在尋找的是ng-init?如果{{loadFeed()}}在每個摘要循環中都會被調用,會發生什麼情況,這會使它在你身上發癢。你的按鈕中的ng-init =「loadFeed()」會調用一次,並且{{feeds}}會被填充。 –

回答

1

當第一個$ digest週期被解僱時,將評估您的{{loadFeed()}}表達式。這會調用你的函數parseFeed,它使用$ http。現在,這裏是您的問題的原因,Angular在通過$ http發出的ajax請求中做的最後一件事是致電$ rootScope。$ apply()。這會觸發另一個$ digest循環,這會導致再次對您的表達式進行評估,這會觸發另一個$ rootScope。$ apply(),並且您可以在此處看到無限循環。

+0

非常感謝您的解釋。考慮到這一點,對我來說有效的是Zack Argyle說的ng-init。 – Pedro4441