2013-11-26 34 views
0

即時通訊工作在鉻擴展,並與chrome.storage api有問題。我想將一個數組保存到存儲中,數組將被存儲,但不是數組的值。所以array [x]總是'null'。代碼如下所示:Chrome.storage不會存儲陣列正確

var storage = chrome.storage.local; 
bookmarks = new Array(); 

var newButton = document.createElement('input'); 
//... Button properys are getting set 
bookmarks[bookmarks.length] = newButton; //tried it also with .push() 
var obj = {}; 
obj['bookmarks'] = bookmarks; 
storage.set(obj, function(){ console.log('bookmark saved'); }); 

重啓延伸,並通過獲取存儲後:

storage.get(null, function(result){ 
    console.log('Storage: ', result); 
    }); 

日誌看起來是這樣的:

Storage: 
Object 
bookmarks: Array[1] 
0: null 
length: 1 
__proto__: Array[0] 
__proto__: Object 

任何建議怎麼回事錯誤的,爲什麼數組不正確存儲?

謝謝!

+0

如果你打印newButton變量,你會得到什麼? – Rayf

+0

如果我記錄按鈕我得到: Scarysize

+0

如果你修復索引,像這樣 - bookmarks [0] = newButton;它仍然存儲空?存儲中的 – Rayf

回答

1

要在Chrome.storage中存儲對象,該對象必須是可序列化的。您可以通過嘗試JSON.stringify()來測試對象是否可序列化。如果您嘗試在控制檯以下:

JSON.stringify(document.createElement('input')); 

你會看到一個錯誤被拋出 - TypeError: Converting circular structure to JSON。這意味着對象不能被序列化,因爲它包含對自我的引用。

眼看作爲DOM元素不能序列,並且因此不能被存儲,一個解決方案是創建一個新對象時,所需要的按鈕屬性添加到它,並存儲該替代:

bookmarks = new Array(); 
var newButton = document.createElement('input'); 
//... Button properties are getting set 
var data = { 
    prop: newButton.prop 
}; 
bookmarks.push(data); 
storage.set({ bookmarks: bookmarks }); 
+1

只是一個單挑:與'localStorage'不同,'chrome.storage'可以直接存儲和檢索JSON對象,不需要'JSON.stringify/parse' – gkalpak

+0

thx,明天我會試試這個...現在太累了吧。ofc會給你反饋 – Scarysize

+1

實際的問題不在於hes存儲的是一個對象而不是字符串,但是這個對象需要被序列化。以避免混淆關於chrome.storage vs localStorage –

1

的newButton對象太複雜,無法存儲。相反,你應該存儲一個原始值。例如。如果運行以下操作,則可以從storage.local中檢索預期的{bookmarks:[{foo:"bar"}]}

var storage = chrome.storage.local; 
bookmarks = new Array(); 

bookmarks[bookmarks.length] = {foo:"bar"}; 
var obj = {}; 
obj['bookmarks'] = bookmarks; 
storage.set(obj, function(){ console.log('bookmark saved'); });