2015-06-25 96 views
1

簡而言之,我有一個輪詢器,它根據條件返回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 
}; 
}; 

回答

1

您的輪詢方法會重新分配局部變量newdatamsgdata,但它不會重新分配由服務返回的對象的字段,它們被初始化爲undefined,之後從未修改。

你需要一個參考保持到返回的對象在一個變量:

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

,並在輪詢方法,改變服務中的值:

service.newdata = false; 
0

當你

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

你Poller.newdata得到的數據應該總是VAR newdata的初始值,因爲JavaScript不通過引用傳遞。

項目和消息工作,因爲你正在做angular.copy,它保持相同的參考。

一個簡單的方法來解決,這將在輪詢功能,而不是被傳遞迴一個對象布爾本身

var checkNew = {}; 

的在控制器

回報

checkNew: checkNew 

checkNew.newdata = true; 

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

乾淨的方式(imo)做到這一點將暴露輪詢功能作爲服務功能的控制器。通過這種方式,你不需要在服務上有一個超時,只要控制器調用它就會獲得數據。