1

我有一系列这样的大厅,我是从 $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.

我不太确定该怎么做。

我仍处于学习角度的早期阶段,所以如果你能温柔地指出一种有效的方法会很好。

4

3 回答 3

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.');
});
于 2013-10-15T20:08:02.597 回答
1

我不认为这是你可以轻易做到的。该$watch函数监视在范围内执行的某个角度表达式。你没有,$scope.hall所以它不会做任何事情。您可能观察每个实例,但如果您在数组中添加或删除项目怎么办?

$scope.$watch('halls[0].occupancy.timeRange.to', function(a, b) {

当有任何变化时,最好只观察halls数组并循环遍历它以检查每个项目。这基本上就是 angular 检测变化本身的作用。

$scope.watch('halls', function (newValue, oldValue) {
    var now = Date.now();
    for (var i = 0; i < newValue.length; i++) {
        // check each item
    }
};
于 2013-10-15T18:26:32.407 回答
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 字段。

如果您有更好的解决方案,请告诉我。

于 2013-10-15T20:27:16.017 回答