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

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>

Приветствуются любые идеи, почему представление не обновляется.

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

1
fortpointuiguy 22 Янв 2016 в 18:50
Вам нужно $scope.$apply() везде, где вы обновляете $scope.myTime в функции ajax
 – 
Vicky Gonsalves
22 Янв 2016 в 18:52
Вы не используете angular $http для запроса ajax, я также вижу там использование setTimeout (вместо $timeout / $interval) - цикл дайджеста "не знает" "об этих изменениях, чтобы мнение не изменилось
 – 
Alon Eitan
22 Янв 2016 в 18:53
1
Вы делаете две вещи, выходящие за рамки angular. Первый - это jquery AJAX, второй - setTimeout. Нет необходимости использовать ни то, ни другое, используйте angular $http и $timeout. проблема в том, что это происходит за пределами области действия angulars, поэтому он не знает, что ему нужно обновлять привязки. Вы случайно не применяете angular к приложению на основе jquery?
 – 
ste2425
22 Янв 2016 в 18:54
Всем спасибо за советы и отзывы. Изначально у меня была строка, в которой я был новичком в angular, но теперь я думаю, что это довольно очевидно. Я воспользуюсь существующими сервисами angular и отчитаюсь. Я брал существующий код из приложения на основе jQuery и пытался повторно использовать его в этом угловом приложении.
 – 
fortpointuiguy
22 Янв 2016 в 23:00

2 ответа

Несколько общих советов:

  • не используйте метод jquery http. Вам следует предпочесть услугу $ http angular.
  • не используйте функцию тайм-аута. Вы должны предпочесть услугу $ timeout angular.
  • не вызывайте удаленные службы http внутри вашего контроллера. Вам следует создать специальный сервис.
1
alberto-bottarini 22 Янв 2016 в 19:22
Спасибо. Это согласуется с другим советом, за исключением того, что я перенесу опрос в службу. Спасибо еще раз.
 – 
fortpointuiguy
22 Янв 2016 в 23:01

Дальнейшее улучшение может заключаться в использовании службы $ interval.

0
Francis Phiri 5 Авг 2016 в 05:45