Подтвердить что ты не робот

AngularJS с событиями, отправленными сервером

У меня есть приложение AngularJS со следующим контроллером. Он отлично работал с GET на регулярном ресурсе JSON и ручным запросом на обновления, но я не могу заставить его работать с событиями Server-Sent. Проблема, с которой я столкнулся, заключается в том, что после получения SSE-события и установки/обновления переменной openListingsReport мое представление не обновляется. Очевидно, я пропустил очень элементарную концепцию. Пожалуйста, помогите мне исправить это.

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

rpCtrl.controller('rpOpenListingsCtrl', ['$scope', 'rpOpenListingsSvc',
    function ($scope, rpOpenListingsSvc) {
        $scope.updating = false;

        if (typeof(EventSource) !== "undefined") {
            // Yes! Server-sent events support!
            var source = new EventSource('/listings/events');

            source.onmessage = function (event) {
                $scope.openListingsReport = event.data;
                $scope.$apply();
                console.log($scope.openListingsReport);
            };
        }
    } else {
        // Sorry! No server-sent events support..
        alert('SSE not supported by browser.');
    }

    $scope.update = function () {
        $scope.updateTime = Date.now();
        $scope.updating = true;
        rpOpenListingsSvc.update();
    }

    $scope.reset = function () {
        $scope.updating = false;
    }
}]);
4b9b3361

Ответ 1

Проблема была в следующей строке:

$scope.openListingsReport = event.data;

который должен быть:

$scope.openListingsReport = JSON.parse(event.data);

Ответ 2

Просто предложение, если кто-то использует SSE с AngularJs.

Если вы хотите использовать события на стороне сервера, я предлагаю использовать службу $interval, которая встроена в AngularJS вместо SSE.

Ниже приведен базовый пример.

<html>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js"></script>
<body>

<div ng-app="myApp" ng-controller="myCtrl">

    <p>Randome no:</p>

    <h1>{{myWelcome}}</h1>

</div>

<p>The $interval service runs a function every specified millisecond.</p>

<script>
    var app = angular.module('myApp', []);
    app.controller('myCtrl', function ($scope, $interval, $http) {
        $scope.myWelcome = new Date().toLocaleTimeString();
        $interval(function () {
            $scope.myWelcome = $http.get("test1.php").then(function (response) {
                $scope.myWelcome = response.data;
            });
        }, 3000);
    });
</script>

</body>
</html>

test1.php

<?php

echo rand(0,100000);