返回的服务值总是在控制器内部未定义?

时间:2015-06-25 05:19:43

标签: angularjs

简单地说,我有一个Poller,它根据条件返回msgdata和newdata变量,但是在这种情况下返回的值总是未定义的。条件应该覆盖在服务中初始化正确的初始变量吗?

如何让Poller.msgdata和Poller.newdata返回TRUE或FALSE给控制器?

控制器:

app.controller('sidemenuController', ['$scope', 'projectsModal', 'sendMessageModal', 'Poller', '$timeout',  
    function($scope, projectsModal, sendMessageModal, Poller, $timeout) {

    var update = function() {
    $timeout(update, 5000);
        $scope.inbox = Poller.msgdata;
        $scope.project = Poller.newdata;
        console.log("Updated SideMenu Controller: " + Poller.msgdata);
    }
    update();

    $scope.projects = Poller.projects;
    $scope.messages = Poller.messages;

    $scope.sendMessage = sendMessageModal.activate;
    $scope.showModal = function() {
        projectsModal.deactivate();
        projectsModal.activate();
    };

    $scope.toggle = function(){
        $scope.checked = !$scope.checked
        projectsModal.deactivate();
        sendMessageModal.deactivate();
    }

}]);

服务:

app.factory('Poller', Poller);
Poller.$inject = ['$http', '$timeout'];

function Poller($http, $timeout) {

var projectcache = { response: [], calls: 0 };
var msgcache = { response: [], calls: 0 };
var newdata;
var msgdata;

var poller = function () {
  $timeout(poller, 5000);
   $http.get('http://localhost/app/controllers/php/getProjects.php')
   .then(function(r) {
     if (r.data.projects.length > projectcache.response.length) {
      newdata = true;
      angular.copy(r.data.projects, projectcache.response);
     } else {
      newdata = false;
     };
     console.log(msgdata);
   });
   $http.get('http://localhost/app/controllers/php/getMessages.php')
   .then(function(m) {
     if (m.data.messages.length > msgcache.response.length) {
      msgdata = true;
      angular.copy(m.data.messages, msgcache.response);
     } else {
      msgdata = false;
     };
   });
};
poller();

return {
  projects: projectcache.response,
  messages: msgcache.response,
  newdata: newdata,
  msgdata: msgdata
};
};

2 个答案:

答案 0 :(得分:1)

您的轮询方法重新分配局部变量newdatamsgdata,但它不会重新分配服务返回的对象的字段,这些字段初始化为未定义且从未修改过。

您需要在变量中保留对返回对象的引用:

var service = { ... };
...
return service;

并在轮询方法中,更改服务中的值:

service.newdata = false;

答案 1 :(得分:0)

当你这样做时

return {
  projects: projectcache.response,
  messages: msgcache.response,
  newdata: newdata,
  msgdata: msgdata
};

从Poller.newdata获取的数据应该始终是var newdata的初始值,因为javascript不会通过引用传递。

项目和消息的工作原理是因为你正在做angular.copy,它保留了相同的参考。

解决这个问题的一种简单方法是传回一个对象而不是布尔本身

var checkNew = {};
轮询函数中的

checkNew.newdata = true;

作为回报

checkNew: checkNew
控制器中的

$scope.inbox = Poller.checkNew.msgdata;
$scope.project = Poller.checkNew.newdata;

执行此操作的更简洁方法(imo)将轮询器功能作为服务功能暴露给控制器。通过这种方式,您不需要在服务上超时,只要控制器调用它就会获取数据。