Angular.js — Вызвать функцию области видимости извне контроллера?

#javascript #angularjs #addeventlistener

#javascript #angularjs #addeventlistener

Вопрос:

Я новичок в angular.js и пытаюсь понять, как передать объект json из четного обработчика в функцию области видимости в контроллере (или вместо этого в сервисе?). Я хочу, чтобы прослушиватель событий находился за пределами всех контроллеров и т.д., потому что мне нравится соглашение только о обработчике событий для прослушивания всех событий, а не нескольких прослушивателей событий для каждого события. Как я могу это сделать с Angular.js ?

клиентский код:

 var source = new EventSource('/subscribe');

source.addEventListener('open', function(e) {
    console.log("connection was opened");
});
//Not using multi-listeners for each event.  
source.addEventListener('message', function(e) {
    var result = JSON.parse(e.data);
    event = Object.keys(result)[0];
    if (event == "cpuResult") {
        //call the function of cpuScope 
        //pass json into it
        } else if if (event == "networkResult") {
             //call the function of neworkScope
       and so on....
});

source.addEventListener('error', function(e) {
  if (e.readyState == EventSource.CLOSED) {
  }
}, 
 

ложь);

грубый angular.js пример:

    function cpuCtrl($scope) {

        // the last received msg
        $scope.msg = {};


        var updateElement = function (msg) {
            $scope.$apply(function () {
                $scope.msg = JSON.parse(msg.data)
            });
        }

     }
 

Комментарии:

1. Худшим ответом будет предоставление вам плунжера, который работает с тем, что вы пытались сделать. Вместо этого, я думаю, вам следует просто прочитать об angular services и внедрении зависимостей, начиная с services: docs.angularjs.org/guide/services и разберись с остальным. Вернитесь, если у вас все еще есть проблемы 🙂

2. Кажется, я понимаю… Я могу создать службу, содержащую прослушиватель событий. Если я введу эту же службу для каждого контроллера, будет ли несколько прослушивателей событий? Или это все еще только один eventlistener в клиенте?

3. Зависит от вашей реализации. Лучшая реализация, о которой я могу думать, — это предоставить вашей службе функцию «register», которую может вызывать каждый контроллер, и предоставить ей обратный вызов в качестве аргумента. Служба сохранит массив обратных вызовов. У службы будет один прослушиватель событий, который при запуске будет вызывать все обратные вызовы один за другим. Это также можно улучшить, включив функцию «отмены регистрации», которую вы будете возвращать, когда контроллер больше не хочет получать свой обратный вызов при срабатывании события.