2015-01-02 3 views
3

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

Вот что у меня есть:

cadApp.controller('statsController', function ($scope, DashboardStats) { 
    $scope.data = DashboardStats.data.response; 
    console.log(JSON.stringify(DashboardStats.data.response));  
}); 

cadApp.run(function (DashboardStats) { }); 

cadApp.factory('DashboardStats', function ($http, $timeout) { 
    $http.defaults.headers.post["Content-Type"] = "application/x-www-form-urlencoded"; 

    var data = { response: {}, calls: 0 }; 
    var url = "Ajax/CADAjax.aspx"; 
    var params = { "Command": "GetDashboardStats" }; 

    var poller = function() { 
     $http.post(url, Object.toparams(params)) 
    .then(function (responseData) { 
     data.response = responseData.data[0]; 

     // This is working 
     console.log(JSON.stringify(responseData.data[0])); 
     data.calls++; 
     $timeout(poller, 10000); 
    }); 
    }; 
    poller(); 

    return { 
     data: data 
    }; 
}); 

Интерфейс никогда не обновляется с текущим объектом, возвращенного службой опроса. Я предполагаю, что оператор return в сервисе неверен. Он возвращает только в основном пустой объект, объявленный в верхней части службы.

Как мне получить услугу, чтобы автоматически обновлять контроллер всякий раз, когда возвращается ответ HTTP?

ответ

4

Вы получили return некоторые из этих данных - и не ставьте логику timeout в службу - это должно содержаться в коде контроллера. Вы можете реорганизовать, чтобы обработать ответ контроллера и вызов данных, содержащихся в службе:

cadApp.controller('statsController', function ($scope, $timeout, DashboardStats) { 
    pollData(); 

    function pollData() { 
     DashboardStats.poll().then(function(data) { 
      $scope.data = data; 
      $timeout(pollData, 10000); 
     }); 
    } 
}); 

cadApp.factory('DashboardStats', function ($http, $timeout) { 
    $http.defaults.headers.post["Content-Type"] = "application/x-www-form-urlencoded"; 

    var url = "Ajax/CADAjax.aspx"; 
    var params = { "Command": "GetDashboardStats" }; 
    var data = { response: { }, calls: 0 }; 

    var poller = function() { 
     return $http.post(url, Object.toparams(params)).then(function (responseData) { 
      data.calls++; 
      data.response = responseData.data[0]; 

      return data; 
     }); 
    }; 

    return { 
     poll: poller 
    } 
}); 
+1

Отлично! Я благодарю тебя. Я занимаюсь несколькими часами в использовании Angular, и я люблю его, просто нужно освободиться от привычек потока jQuery. Смешно то, что я как раз собирался прокомментировать, что он работал, за исключением недостающего индекса [0] этого массива JSON, который возвращается. Вы отредактировали свой пост слишком быстро, чтобы я мог комментировать :) Еще раз спасибо! –

+0

@tymeJV Почему вы советуете, чтобы логика тайм-аута содержалась в коде контроллера, а не в сервисе? Я пытаюсь определить наилучшую практику опроса с угловым. – defaultcheckbox

3

Вам нужен обратный вызов в вашей фабрике, а затем вернуть функцию, которая будет использоваться в контроллере:

cadApp.factory('DashboardStats', function ($http, $timeout) { 
    $http.defaults.headers.post["Content-Type"] = "application/x-www-form-urlencoded"; 

    var data = { response: { }, calls: 0 }; 
    var url = "Ajax/CADAjax.aspx"; 
    var params = { "Command": "GetDashboardStats" }; 

    var poller = function (success) { 
     $http.post(url, Object.toparams(params)).then(function (responseData) { 
      data.response = responseData.data[0]; 
      success(data); 
      data.calls++; 
      $timeout(poller, 10000); 
     }); 
    }; 

    return { 
     poller: poller 
    }; 
}); 

, а затем в контроллере вызова функции poller и внутри success обратного вызова обновить объем:

cadApp.controller('statsController', function ($scope, DashboardStats) { 
    DashboardStats.poller(function(data) { 
     $scope.data = data; 
    }); 
}); 
Смежные вопросы