2014-10-29 76 views
1

我正在开发我的第一个Angular项目,并且我一直在考虑用这个问题说出一段时间的最佳方式,但是我要给这个镜头。更新来自不同来源的AngularJS数据

我正在构建一个使用Veralite(MiOS)以json格式返回设备数据的应用程序。第一个请求返回系统中的所有设备(下面的示例)。

"devices":[ 
     { 
     "name":"Bedroom Light", 
     "altid":"4", 
     "id":6, 
     "category":2, 
     "subcategory":0, 
     "room":0, 
     "parent":1, 
     "status":"0", 
     "level":"0", 
     "state":-1, 
     "comment":"" 
     }, 
     { 
     "name":"Office Light", 
     "altid":"6", 
     "id":18, 
     "category":2, 
     "subcategory":0, 
     "room":0, 
     "parent":1, 
     "level":"0", 
     "status":"0", 
     "state":-1, 
     "comment":"" 
     } 

一旦所有的设备都返回,我的脚本开始长时间轮询维拉引擎。一旦对设备进行了更改,则返回长轮询的结果,但结果只包括已更改的设备(下面的示例)。

"devices":[ 
     { 
     "altid":"6", 
     "id":"18", 
     "subcategory":"0", 
     "room":"0", 
     "parent":"1", 
     "level":"20", 
     "status":"1", 
     "state":"4", 
     "comment":"Office Light: Transmit was ok" 
     } 

什么我想绕到我的头,是更新现有设备阵列与最新更新的数据的正确方法。我是否需要将它们转换为数组,然后遍历每个数组并尝试通过键匹配它们?

希望我尽可能清楚地问到这一点。

编辑:只是为了更新这一点,任何人都发现了这一点,特别是有兴趣为Veralite开发的人。从原始请求返回的ID将作为整数返回,但当长轮询引擎时,ID将作为字符串返回。因此,即使所选答案是正确的,您仍然需要将更新后的设备ID解析为整数(parseInt),或者在过滤设备时仅使用==而不是== ==。

回答

0

您可以循环访问对象字段,就像使用Object.keys循环访问数组一样。

概念是这样的:

步骤1)找到更新的产品,由现场ID:

var previousVersionDevice = $scope.devices.filter(function(item) { 
    return item.id === updateDevice.id; // Keep only the one existing device that matches id 
})[0]; 

步骤2)遍历产品密钥,并与那些覆盖以前的值接收。

Object.keys(updatedDevice).forEach(function(key) { 
    previousVersionDevice[key] = updatedDevice[key]; // Overwrite/add all from updated version 
}); 
+0

不够公平,但我该如何将新值推送到$ scope变量? – Chris 2014-10-29 21:34:25

+0

如果你只是更新字段值,你根本没有更新$ scope变量(我认为它是数组,$ scope.devices)。 – 2014-10-29 21:36:16

+0

假设在轮询之后返回了多个更新的设备,这是否是相同的方法?我会窝窝吗? – Chris 2014-10-29 21:50:20

0

是的,你可以循环遍历并发现通过某种唯一键的匹配装置(假设id是独一无二的,不会改变,你可以使用)。

相关问题