简单地说,我有一个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
};
};
答案 0 :(得分:1)
您的轮询方法重新分配局部变量newdata
和msgdata
,但它不会重新分配服务返回的对象的字段,这些字段初始化为未定义且从未修改过。
您需要在变量中保留对返回对象的引用:
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)将轮询器功能作为服务功能暴露给控制器。通过这种方式,您不需要在服务上超时,只要控制器调用它就会获取数据。