0

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

Так, например, у меня есть контроллер MyController, который содержит массив orders, содержащий Order объектов. Когда новый Order выполнен поверх API REST на сервере с другого клиента, я хочу получить обновление в своем приложении. Итак, я написал directiveorderRefresher, который применяется к <body> и запускает $interval, который выбирает все заказы каждые 120 секунд. При получении новых Orders они транслируются с $rootScope.

В MyController существует прослушиватель, который обновляет заказы при трансляции соответствующего события.

Проблема заключается в том, что слушатель установлен на $scope и не уничтожается при уничтожении контроллера, что вызывает ошибки при попытке установить свойство orders (не существует).

Я думал о том, чтобы просто обернуть его внутри try-catch, но тогда мне придется подождать, пока $interval будет снова запущен, чтобы получать обновления при восстановлении контроллера.

Так как я могу решить эту проблему? Есть ли лучшее решение, чем мое?

ответ

0

Лучшее решение было бы поставить HTTP логику внутри службы (синглтон, которая существует на протяжении всей жизни вашего приложения)

Вы можете иметь контроллер делают запросы на в $interval или иметь службу это сделать , Контроллеры могли затем $watch результирующие заказы, чтобы спасти вас, чтобы транслировать событие.

Что-то вроде этого

app.service(
    "orderService", 
     function($http, $interval) { 
      // Return public API. 
      var api = { 
       orders: [] 
      }; 

      $interval(update, 10000); //10 second interval 

      return api; 

      function update(){ 
       $http("/api/request").then(function(response){ 
        api.orders = response.data; 
       }); 
      } 
     }); 

В контроллерах просто впрыснуть orderService, а затем сделать что-то вроде

$scope.$watchCollection(
    function(){ 
     return orderService.orders 
    }, 
    function(){ 
     console.log("orders have changed"); 
    }); 
Смежные вопросы