angular $监视数组中所有对象的特定字段

时间:2013-10-15 18:10:43

标签: javascript angularjs

我有一系列像这样的大厅,我从$ 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会非常麻烦。

我不确定如何解决这个问题。

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

3 个答案:

答案 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字段。

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