我有一系列像这样的大厅,我从$ http.get()获得。
$scope.halls = [
{
"_id": "524886d4c6d8a5a3b8949f6f",
"alias": "",
"hallId": "2",
"locationHint": "Near support team",
"name": "Conference Hall",
"bookQueue": [],
"occupancy": {
"occupied": true,
"occupiedBy": "Vignesh",
"purpose": "Sync up",
"team": "Edge",
"timeRange": {
"from": "2013-10-02T19:08:44.752Z",
"to": "2013-10-02T19:08:44.752Z"
}
},
"capabilities": [
"ceiling mic",
"room speaker",
"projector",
"Mac machine"
]
},
{
"_id": "524886fbc6d8a5a3b8949f70",
"alias": "",
"hallId": "3",
"locationHint": "Near Edge Team",
"name": "Training room",
"bookQueue": [],
"occupancy": {
"occupied": true,
"occupiedBy": "Tharma",
"purpose": "Review",
"team": "Platform",
"timeRange": {
"from": "2013-10-02T19:08:44.752Z",
"to": "2013-10-02T19:08:44.752Z"
}
},
"capabilities": [
"ceiling mic",
"room speaker",
"projector"
]
},
{
"_id": "52488794c6d8a5a3b8949f71",
"alias": "",
"hallId": "4",
"locationHint": "Near front office",
"name": "Front Office Discussion room",
"bookQueue": [],
"occupancy": {
"occupied": false,
"occupiedBy": "",
"purpose": "",
"team": "",
"timeRange": {
"from": "2013-10-02T19:08:44.752Z",
"to": "2013-10-02T19:08:44.752Z"
}
},
"capabilities": [
"ceiling mic",
"room speaker",
"TV"
]
}
]
我希望在当前日期(hall.occupancy
)大于Date.now()
时更新hall.occupancy.timeRange.to
。在这种情况下,我不会看hall.occupancy.timeRange.to
,因为它不是要改变的属性。是否有一种有角度的方式来做到这一点,因为放置setInterval
会非常麻烦。
我不确定如何解决这个问题。
我仍然处于学习角度的早期阶段,所以如果你温柔地指出一种有效的方式会很好。
答案 0 :(得分:1)
我不认为这是你可以轻易做到的事情。 $watch
函数监视在作用域中执行的某个角度表达式。你没有$scope.hall
所以它不会做任何事情。您可以可能观看每个实例,但是如果您在数组中添加或删除项目会怎么样?
$scope.$watch('halls[0].occupancy.timeRange.to', function(a, b) {
最好只观看halls
数组并循环浏览它,以便在任何更改时对每个项目进行检查。这基本上是角度来检测变化本身。
$scope.watch('halls', function (newValue, oldValue) {
var now = Date.now();
for (var i = 0; i < newValue.length; i++) {
// check each item
}
};
答案 1 :(得分:1)
您可以按hall.occupancy.timeRange.to
对数组进行排序,然后执行setInvertal
到最近的即将到来的日期。在定时器事件被触发后,从排序列表中获取下一个项目时再次执行相同操作。
如果您的列表发生更改,则必须取消激活超时并使用所述过程设置新的超时。
在我看来,如果您想为非活动用户创建通知,$digest
阶段是不够的 - 他们会将网站留下打开的标签并执行其他操作(我经常使用Stackoverflow执行此操作)。
然而如果你的应用程序中有很多用户事件(点击,玩ng-model等),你应该观察时间并在每10秒后查看一次列表:
var watchFn = function() {
var d = new Date();
return '' + d.getMinutes() + Math.floor(d.getSeconds()/10);
};
$scope.$watch(watchFn, function() {
console.log('User did something and $watch is fired after minimum 10s.');
});
答案 2 :(得分:0)
也许,我这样做是为了解决这个问题,但我不确定这是不是最好的方法。
setInterval(function(){
if($scope.halls)
{
for(var i =0 ;i< $scope.halls.length;i++){
var hall = $scope.halls[i];
if(hall.occupancy.timeRange.to){
if(Date.now() > new Date(hall.occupancy.timeRange.to.toString())){
//change occupancy.. either dequeue from blockQueue, shift to occupancy, or change occupancy.occupied to false
$scope.halls[i].occupancy = {occupied:false,occupiedBy:"",purpose:"",team:"",timeRange:{from:"",to:""}};
socket.emit('updateHall',$scope.halls[i]);
$scope.$apply();
}
}
}
}
},500);
所以,基本上,它每隔500毫秒检查当前时间是否晚于hall.occupancy.timeRange.to,如果是,则重置hall.occupancy字段。
如果您有更好的解决方案,请告诉我。