Chrome.storage.sync.set后对象属性变为null

7

我正在开发一个Chrome扩展程序,遇到了一个我无法理解的错误。问题在于Chrome存储中的单个对象属性会变成null

我通过以下方式进行测试:

console.log("pre-storage", settings);
var obj = {};
obj[storage_key] = settings;

chrome.storage.sync.set(obj, function() {
    chrome.storage.sync.get(storage_key, function(data) {
        console.log("post-storage", data[storage_key]);
    });
});

这是输出结果:
pre-storage, Object {
    ...
    soundClip: Object {
        options: Array[5],
        selected: Object {
            label: "Soft2",
            value: "snd/soft2.wav"
        }
    }
}

post-storage, Object {
    ...
    soundClip: Object {
        options: Array[5],
        selected: null
    }
}

存储 JSON.parse(JSON.stringify(obj)) 而不是直接存储 obj 似乎可以解决这个问题。有没有人知道可能是什么原因导致这个问题?任何帮助都将不胜感激!
编辑:复制 obj 的深层副本并不能解决这个问题。
编辑2:我应该详细说明一下如何设置 settings.soundClip。我正在使用 Angular(1.x)和自定义选择指令。简化后的指令如下:
function mySelect() {
    return {
        restrict: "E",
        templateUrl: "mySelect.html",
        scope: {
            options: "=",
            selected: "="
        },
        link: function (scope) {
            scope.select = function (item) {
                scope.selected = item;
            };
        }
    }
}

指令模板视图 (mySelect.html):

<div>
    <div ng-repeat="item in options track by $index"
         ng-click="select(item)">
    </div>
</div>

然后,这些属性可以进行双向绑定,如下所示:

<my-select selected="settings.soundClip.selected"
           options="settings.soundClip.options">
</my-select >
2个回答

0

是否有可能达到了总配额(或每个项目的配额)?考虑在设置回调函数时显示runtime.lastError以查看是否有任何错误消息。

chrome.storage.sync.set(obj, function() {

  console.log('Error', runtime.lastError);

  chrome.storage.sync.get(storage_key, function(data) {
    console.log("post-storage", data[storage_key]);
  });
});

在这里查看限制chrome.storage.sync.set


嗨,谢谢回复!我怀疑不是因为我达到了限制,这个对象只有434字节。chrome.runtime.lastError没有定义,这一切都太奇怪了! - Easypeasy
1
你能再试一次吗?但是不要使用 Angular 中的数据,而是使用你期望从中获取的值?正如 @eholder0 所建议的那样,这些值的序列化可能没有正确完成。 - Pablo Navarro

0

由于调用JSON.parse(JSON.stringify(obj))似乎可以解决它,我猜测您正在使用变量而不是字符串对设置对象进行编码时遇到问题。请参见此处的答案,这可能会有所帮助。


谢谢回复!不幸的是,使用“test”而不是“storage_key”得到了相同的结果。 - Easypeasy
没错,既然你通过 storage_key 取出了值,我就默认它能用。不过,我还是建议你仔细检查一下你是如何将任何值放入 settings.soundClip.selected(或类似的字典语法)中的,因为那是有问题的唯一部分,这样更清楚明确。抱歉如果有任何混淆之处。 - eholder0
是的,这可能会引起兴趣,我已经在原始问题中添加了额外的信息! - Easypeasy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接