3

Chrome拡張機能を作ろうとしています。その拡張機能には、動的に作成される情報が必要ですが、後で (別のページで) そのデータを追加したいと考えています。

これは、(プラグインの実行時に) 常にアクセスできるようにしたいある種のデータです。

var villages = new Array();
villages[0][0] = "village1"; 
villages[0][1] = "1325848"; 
villages[1][0] = "village2"; 
villages[1][1] = "8744351"; 
villages[2][0] = "village3"; 
villages[2][1] = "8952187"; 

ご覧のとおり、配列は多次元です。これは、名前 [0] と村 ID 1を一緒に保存したいためです。

この問題を処理する良い方法を知っている人はいますか?

私はこれを見てきました: jQuery Cookie

しかし、それが問題を処理する適切な方法であるかどうかはわかりません。

または、すべての値を含む何らかの種類の XML ファイルを作成する必要がありますか?

4

1 に答える 1

10

アップデート:

これはスケルトンの例です。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 は、データがローカル ストレージに保存されるときに名前として使用されます。これは、データ コレクションの単なる名前です。したがって、もちろん、変更することも、やりたいことをすることもできます。それはあなた次第です。

  • この行の番号を変更するときに達成する目標は何ですか: dataVersion: 3, //if you want to set a new default data, you must update "dataVersion"?

ユーザーがこの拡張機能を初めて実行したとき、localstorage にはデータがありません。デフォルトの村のリストが使用されるので、

私の例では、デフォルトの村のリストは、

[
    {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がまだ同じかチェックします. 同じでなければ, 判断します.

"更新されたデフォルト データがあるので、ローカル ストレージをクリアして新しいデータをローカル ストレージにリロードする必要があります"

したがって、この行を変更しない場合、

ExtensionData.villages.push(
    {id: "1325848", name: "village1"},
    {id: "8744351", name: "village2"},
    {id: "8952187", name: "village3"}
);

あなたが変わらないよりdataVersion

于 2012-12-18T23:10:23.727 に答える