我正在构建一个镀铬扩展程序并遇到了一个我无法绕过头脑的错误。问题是单个对象属性在chromes'中成为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
的深层副本并不能解决问题。
Edit2:我应该扩展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 >
答案 0 :(得分:0)
由于调用JSON.parse(JSON.stringify(obj))似乎解决了这个问题,我的猜测是你在使用变量而不是字符串编码设置对象时遇到问题。请参阅可能有帮助的答案here。
答案 1 :(得分: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