在chrome.storage.sync.set之后,对象属性变为null

时间:2016-01-27 20:20:04

标签: javascript angularjs google-chrome google-chrome-extension

我正在构建一个镀铬扩展程序并遇到了一个我无法绕过头脑的错误。问题是单个对象属性在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 >

2 个答案:

答案 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