2014-04-20 4 views
6

나는 인터넷에서 일정 시간 간격으로 $ http json 요청을 업데이트 할 수 있고 동시에 내 바인딩을 업데이트 할 수있는 솔루션을 찾으려고했습니다. 새로운 데이터로각도 js 간격에 json 업데이트 및보기 업데이트

$ timeout을 사용하는 몇 가지 예제를 보았지만 제대로 작동하지 못했고 가장 좋은 방법이 무엇인지 알고 싶었습니다. 또한 새로운 데이터를 가져온 뷰를 업데이트 할 수 있다는 것은 새로운 요청을 할 수 없었기 때문에 해결할 수없는 것입니다.

다음은 현재 빌드입니다.

app.js 파일은 json의 초기 가져 오기를 보여줍니다.

var myApp = angular.module('myApp', ['ngRoute']); 

    myApp.controller('MainCtrl', ['$scope', '$http', 
     function($scope, $http, $timeout) { 
      $scope.Days = {}; 

      $http({ 
       method: 'GET', 
       url: "data.json" 
      }) 
       .success(function(data, status, headers, config) { 
        $scope.Days = data; 
       }) 
       .error(function(data, status, headers, config) { 
        // something went wrong :(
       }); 

     } 
    ]); 

HTML 설정은 :

<ul ng-controller="MainCtrl"> 
    <li class="date" ng-repeat-start="day in Days"> 
    <strong>>{{ day.Date }}</strong> 
    </li> 

    <li class="item" ng-repeat-end ng-repeat="item in day.Items"> 
    <strong>>{{ item.Name }}</strong> 
    </li> 
</ul> 
+0

내가 무엇을 이해하지 못하는 당신 성취하려고 노력하십시오. 당신의 예제에서 당신은'Day' 객체를 반환하는 http 비동기 호출을 호출합니다. 'ngRepeat' 지시어는'Days' 변경 (개인 관찰자 있음)을 청취하고 새로운 데이터를 보여준다. 뭐가 문제 야? 감사합니다, –

+0

서버에서 요청하는 json 데이터가 지속적으로 업데이트되고 있으며 업데이트 된 json 데이터를 가져 와서 현재 뷰를 업데이트하기 위해 $ http를 호출하도록 시간 제한 함수를 설정해야한다는 인상하에있었습니다. 어쩌면 나는 각형이 어떻게 작동하는지에 대해서 아직도 약간 잘못 알고있을 것입니다. 내 사과. – Anks

+0

그래서 나는 약간의 지연을 가지고 루프 http로 실행하고 싶다고 생각한다. –

답변

9

나는 $timeout를 사용합니다.

알고 계시 겠지만 $timeout 반환 약속. 따라서 약속이 해결되면 다시 myLoop 메서드를 호출 할 수 있습니다.

다음 예제에서 우리는 http를 10 초마다 호출합니다. 보조 노트로

var timer; 

function myLoop() { 
    // When the timeout is defined, it returns a 
    // promise object. 
    timer = $timeout(function() { 
     console.log("Timeout executed", Date.now()); 
    }, 10000); 

    timer.then(function() { 
     console.log("Timer resolved!"); 

     $http({ 
      method: 'GET', 
      url: "data.json" 
     }).success(function (data, status, headers, config) { 
      $scope.Days = data; 
      myLoop(); 
     }).error(function (data, status, headers, config) { 
      // something went wrong :(
     }); 
    }, function() { 
     console.log("Timer rejected!"); 
    }); 

} 

myLoop(); 

: 컨트롤러를 호출해야합니다 파괴

$timeout.cancel(timer);

// When the DOM element is removed from the page, 
// AngularJS will trigger the $destroy event on 
// the scope. 
// Cancel timeout 
$scope.$on("$destroy", function (event) { 
    $timeout.cancel(timer); 
}); 

이 데모 Fiddle

+0

$ interval을 사용하는 것보다 $ timeout을 사용하면 어떤 이점이 있습니까? – Anks

+0

@Anks 우리의 경우에는 비동기 호출이기 때문에'$ timeout'이 더 좋습니다. '$ interval '이 덜 비싸고 digest cycle을 실행하지 않도록 플래그를 설정할 수 있다는 것은 사실입니다. 그러나 우리의 경우 우리는 성공 콜백을받은 경우에만 다음 호출을 시작합니다. 요청이 실패하거나 멈춘 경우,'$ interval '은 http 호출을 반복하여 반복합니다. 그래서 당신의 선택은 무엇이 더 낫습니다. –

+0

BTW, 다음은 DOCS입니다. https://docs.angularjs.org/api/ng/service/$interval –