2014-10-29 54 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是獨一無二的,不會改變,你可以使用)。