9

そこで私は、Web で見つけた画像の色を調整して保存できるようにするための拡張機能を作成しています。順調に進んでいますが、実際にどのように保管するかを構想し、保管アイテムをリストアップしようとしています。

私が知る限り、chrome.storage.sync() はオブジェクトのみを許可します。つまり、次のようなことをしなければなりません。

{colors: [{colorName: 'white', colorHex: '#ffffff'}, {colorName: 'black', colorHex: '#000000'}]}

お気に入りのリストに色を追加または削除するたびに、配列全体を取得し、必要な 1 つの項目を変更してから、配列を元に戻す必要があるため、これは非常に非効率的です。配列をスキャンして色が存在するかどうかを確認することは、大きな配列では非常に集中する可能性があることは言うまでもありません。

最終的には、次のようなことができるようになりたいです

 colors['#fff'].name = white;

しかし、それは不可能のようです。

これを達成するための最良の方法について、他のアイデアを聞きたいです。

4

2 に答える 2

2

これについてもよくわからなかったので、小さな例を作成しました。

manifest.json:

{
    "manifest_version": 2,

    "name": "Test",
    "description": "Test.",
    "version": "1.0",

    "permissions": [
        "storage"
    ],
    "content_scripts": [
        {
            "matches": ["https://www.google.com/*"],
            "js": ["content-script.js"]
        }
    ]
}

content-script.js:

console.log("content script loaded")

function modifyObject() {
    chrome.storage.sync.get(null, function(storageData3) {
        storageData3.object.property2 = false;

        chrome.storage.sync.set(storageData3, function() {
            chrome.storage.sync.get(null, function(storageData4) {
                console.log("after setting *only* object: " + JSON.stringify(storageData4));
            });
        });
    });
}

// Dumb attempt at setting only property2 of "object"; will add a new top level object "property2".
function attemptToModifyProperty2() {
    var toSave = { "property2": false };
    chrome.storage.sync.set(toSave, function() {
        chrome.storage.sync.get(null, function(storageData2) {
            console.log("after attemping to set *only* property2: " + JSON.stringify(storageData2));

            modifyObject();
        });
    });
}

function addArray() {
    var toSave = { "array": [1, 2, 3] };
    chrome.storage.sync.set(toSave, function() {
        chrome.storage.sync.get(null, function(storageData1) {
            console.log("after setting *only* array: " + JSON.stringify(storageData1));

            attemptToModifyProperty2();
        });
    });
}

function addObject() {
    var toSave = { "object": { "property1": true, "property2": true } };
    chrome.storage.sync.set(toSave, function() {
        chrome.storage.sync.get(null, function(storageData) {
            console.log("after setting *only* object: " + JSON.stringify(storageData));

            addArray();
        });
    });
}

chrome.storage.sync.clear();

addObject();

google.com にアクセスして (ログインするか、 in を に変更matchesmanifest.jsonhttp) コンソールを開くと、次の出力が表示されます。

content script loaded
content-script.js:42 after setting *only* object: {"object":{"property1":true,"property2":true}}
content-script.js:31 after setting *only* array: {"array":[1,2,3],"object":{"property1":true,"property2":true}}
content-script.js:20 after attemping to set *only* property2: {"array":[1,2,3],"object":{"property1":true,"property2":true},"property2":false}
content-script.js:9 after setting *only* object: {"array":[1,2,3],"object":{"property1":true,"property2":false},"property2":false}

これからの私の結論は、トップレベルのオブジェクトを設定することだけが可能であるということでした. トップレベル オブジェクト内に深くネストされている 1 つのプロパティだけを変更したい場合でも、オブジェクト全体set()を に渡す必要があります。

于 2015-07-26T09:29:19.487 に答える