2016-11-28 164 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'); 
}); 
相关问题