UPDATE:
这是一个骨架例如,如果你想存储只是village.id和village.name,只需更改默认的数据,目前仍然可以工作。 我已经改变了你的所有代码,你会看到如何迭代数组并获取代码下面的村庄数据。
起初我应该说,这是非常糟糕的做法将数据保存在一个多维数组。
您应该使用对象,它使您的数据整齐,比您可以轻松操作它。
这里是您的情况为例对象,
var village = {
id: "1325848",
name : "village1"
};
console.log(village.id); //1325848
console.log(village.name); //village1
这是一个基本的上手例子。
这里是你的问题与localstorage和JavaScript对象的解决方案。
var ExtensionDataName = "myfirstextensiondata";
var ExtensionData = {
dataVersion: 3, //if you want to set a new default data, you must update "dataVersion".
villages: []
};
//default data
ExtensionData.villages.push(
{id: "1325848", name: "village1"},
{id: "8744351", name: "village2"},
{id: "8952187", name: "village3"}
);
function DB_setValue(name, value, callback) {
var obj = {};
obj[name] = value;
console.log("Data Saved!");
chrome.storage.local.set(obj, function() {
if(callback) callback();
});
}
function DB_load(callback) {
chrome.storage.local.get(ExtensionDataName, function(r) {
if (isEmpty(r[ExtensionDataName])) {
DB_setValue(ExtensionDataName, ExtensionData, callback);
} else if (r[ExtensionDataName].dataVersion != ExtensionData.dataVersion) {
DB_setValue(ExtensionDataName, ExtensionData, callback);
} else {
ExtensionData = r[ExtensionDataName];
callback();
}
});
}
function DB_save(callback) {
DB_setValue(ExtensionDataName, ExtensionData, function() {
if(callback) callback();
});
}
function DB_clear(callback) {
chrome.storage.local.remove(ExtensionDataName, function() {
if(callback) callback();
});
}
function isEmpty(obj) {
for(var prop in obj) {
if(obj.hasOwnProperty(prop))
return false;
}
return true;
}
DB_load(function() {
//YOUR MAIN CODE WILL BE HERE
console.log(ExtensionData);
console.log(ExtensionData.villages); //array of villages
console.log(ExtensionData.villages[0]); //first village object
console.log(ExtensionData.villages[0].id); //first village id
console.log(ExtensionData.villages[0].name); //first village name
//HOW TO ITERATE VILLAGES
for (var i = 0; i < ExtensionData.villages.length; i++) {
console.log(ExtensionData.villages[i].id); //village id
console.log(ExtensionData.villages[i].name); //village name
}
});
问题:
- 是否ExtensionDataName是一样的吗?或者我可以改变它?
ExtensionDataName用作将数据保存到localstorage时的名称,它只是数据集合的名称。因此,你当然可以改变它,做你想做的,这取决于你。
- 是什么,当你改变这一行的数量,你achief目标:
dataVersion: 3, //if you want to set a new default data, you must update "dataVersion"
?
在用户第一次运行此扩展时,本地存储中没有数据。因此使用默认村名单,
在我的例子默认村名单,
[
{id: "1325848", name: "village1"},
{id: "8744351", name: "village2"},
{id: "8952187", name: "village3"}
]
此默认列表保存到localStorage的。在再次运行扩展之后(不是第一次),默认列表不再重要,因为在localstorage中存在一个村庄列表,所以它从localstorage加载村庄列表。
例如,如果你想扩展的运行时间,你可以做这样的过程中添加一个新的村庄,
ExtensionData.villages.push({id: "1215555", name: "village4"});
DB_save();
那么什么是dataVersion
的目标是什么?
如果你看DB_load()
函数,它在那里使用。它检查dataVersion是否仍然是相同的,如果它不一样的,它决定,
“有一个更新的缺省数据,所以我应该清除的localStorage和重新加载新的数据到localStorage的”
所以,如果你不” T改变这一行,
ExtensionData.villages.push(
{id: "1325848", name: "village1"},
{id: "8744351", name: "village2"},
{id: "8952187", name: "village3"}
);
比你都不会改变dataVersion
你熟悉['localStorage'(http://diveintohtml5.info/storage.html)? – apsillers
@apsillers,no。但是,从来没有迟到学习的权利? – Mathlight
@apsillers,这是否适用于谷歌浏览器?因为链接导致一个Firefox页面? – Mathlight