2016-01-22 11 views
1

Я пытаюсь использовать длинный опрос в приложении angularjs. У меня длинный опрос внутри контроллера, который обновляет переменную области видимости, на которую ссылается в представлении. Когда я просматриваю код, происходит опрос, и ожидаемые данные возвращаются, но представление никогда не обновляется.AngularJS Long Polling View Not updated

longpolltest.js

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

myApp.controller('MyController', function($scope, $timeout) { 
    $scope.value = 1; 
    function poll() { 
     var d = new Date(); 
     var n = d.getTime(); 
     $scope.value++; 
     $.ajax({ 
      type: 'GET', 
      url: '/gs/async?millis=' + n, 
      contentType: "application/json; charset=utf-8", 
      async: true, 
      cache: false, 
      success: function(data) { 
       var obj = jQuery.parseJSON(data); 
       if (obj.type == 'ServerTime') 
        $scope.myTime = object.Data.Time; 
       setTimeout("poll()", 1000); 
      }, 
      error: function(XMLHttpRequest, textStatus, errorThrown) { 
       alert("error: " + textStatus + " " + errorThrown); 
       setTimeout("poll()", 10000); 
      } 
     }); 
    } 
    poll(); 
}); 

longpolltest.html

<!DOCTYPE html> 
<html> 
<head lang="en"> 
    <!-- jQuery JavaScript --> 
    <script src="js/ext/jquery-1.12.0.min.js"></script> 

    <!-- angular library --> 
    <script src="js/ext/angular/angular.min.js"></script> 

    <script src="js/ext/angular/angular-route.min.js"></script> 

    <script src="js/longpolltest.js"></script> 

    <meta charset="UTF-8"> 
    <title>Long poll test</title> 
</head> 
<body ng-app="myApp"> 
<div> 
    <div ng-controller="MyController"> 
     <p> 
      Time: {{myTime}} 
      Poll#: {{value}} 
     </p> 
    </div> 
</div> 
</body> 

Любые идеи, почему представление не будет получать обновленные будет в значительной степени будут оценены.

Заранее спасибо.

+0

что вам нужно '$ охват. $ Применяется()', где вы обновляете '$ scope.myTime' в функции АЯКС –

+0

Вы не используете angular '$ http' для ajax-запроса, я также вижу там использование' setTimeout' (вместо '$ timeout' /' $ interval'). Цикл дайджеста не «знает» об этих изменениях, поэтому представление не get changed –

+0

Вы делаете две вещи вне рамок угловой. Первый из них - это AJAX jquery, второй - setTimeout. Нет необходимости использовать любой из них, используйте угловые '$ http' и' $ timeout'. проблема заключается в том, что это происходит за пределами угловой области, поэтому он не знает, что ему нужно обновлять привязки. Вы применяете угловое приложение, основанное на jQuery, случайно. – ste2425

ответ

0

Некоторые общие советы:

  • не использовать JQuery HTTP метод. Вы должны предпочесть $ http угловой сервис.
  • не использовать функцию тайм-аута. Вы должны предпочесть $ timeout угловой сервис.
  • не ссылаются на удаленные службы http внутри вашего контроллера. Вы должны создать выделенный сервис.
+0

Спасибо. Это согласуется с другим советом, за исключением того, что я переведу опрос в службу. Еще раз спасибо. – fortpointuiguy

0

Дальнейшее улучшение может быть, чтобы воспользоваться услугой $ Interval