2016-11-28 70 views
0

我正在寫一個Chrome擴展,其中我需要將數據保存在chrome.storage.local中。但是,它只保存最後一條記錄數據。你能解釋我做錯了什麼嗎?爲什麼chrome.storage.local只保存最後一條記錄?

普通localStorage不好,因爲重置Chrome瀏覽器中的設置後,localStorage爲空。

chrome.runtime.onMessage.addListener(function (request) { 
    if (request.type === 'setInLocalStorage') { 
     var key = request.key; 
     //alert(key); 

     chrome.storage.local.set({key: request.data},function() { 
      alert('data was saved'); 
     }); 

    } 
    return true; 
}); 
chrome.runtime.onMessage.addListener(function (request, sender, SendResponse) { 
    if (request.type === 'getFromStorage') { 
     chrome.storage.local.get(null, function (items) { 
      var allKeys = Object.keys(items); 
      if (allKeys.length != 0) { 
       for (var i = 0; i < allKeys.length; i++) { 
        alert(items[allKeys[i]]); 
        if (items[allKeys[i]] === request.value) { 
         SendResponse(true); 
        } else if (i === allKeys.length - 1) { 
         SendResponse(false); 
        } 
       } 
      } else { 
       SendResponse(false); 
      } 
     }); 
    } 
    return true; 
});  
+1

爲什麼你是否將消息發送到'get()'和'set()'storage.local'? 'storage.local'可以從後臺上下文中運行的內容腳本和腳本中獲得。應該沒有必要傳遞信息。 – Makyen

回答

1

只有最近保存的價值存在於storage.local,因爲你反覆的所有值存儲到財產'key',這是每次打電話時間覆蓋。基本上,你不是在創建對象,你認爲你是在撥打chrome.storage.local.set()

您使用Object literal/Object initializer爲:

{key: request.data} 

這相當於:

{'key': request.data} 

它不會在變量key的價值代替。因此,每次嘗試保存時,您都將數據存儲在屬性'key'中,而不是您在消息中傳遞的密鑰(即request.key)。

您可以直接在你已經在使用對象初始使用computed property name

{[key]: request.data} 

這將導致變量key的內容被用作屬性爲其分配的request.data值。

這將使你的代碼:

chrome.runtime.onMessage.addListener(function (request) { 
    if (request.type === 'setInLocalStorage') { 
     var key = request.key; 
     //alert(key); 

     chrome.storage.local.set({[key]: request.data},function() { //only this line changes 
      alert('data was saved'); 
     }); 
    } 
    return true; 
}); 

或者,你可以做同樣的事情,但有點冗長,首先創建對象,然後設置屬性:

chrome.runtime.onMessage.addListener(function (request) { 
    if (request.type === 'setInLocalStorage') { 
     var setObject = {}; 
     setObject[request.key] = request.data; 
     //alert(key); 

     chrome.storage.local.set(setObject,function() { 
      alert('data was saved'); 
     }); 
    } 
    return true; 
}); 
1

你的問題是在這裏:

var key = request.key; 
//alert(key); 

chrome.storage.local.set({key: request.data},function() { 
    alert('data was saved'); 
}); 

當您使用的符號{key: value}的對象,關鍵是永遠的「鑰匙」,而不是叫key任何變量的值。

你可以做到這一點通過以下方式:

var data={}; 
data[request.key]=request.data; 
chrome.storage.local.set(data,function() { 
    alert('data was saved'); 
}); 

或者,更貼近當前的代碼,用方括號(在那個位置[]沒有定義的數組,是有效的符號定義關鍵是給定變量的值):

var key = request.key; 
//alert(key); 

chrome.storage.local.set({[key]: request.data},function() { 
    alert('data was saved'); 
}); 
相關問題