【问题标题】:Object property becomes null after chrome.storage.sync.setchrome.storage.sync.set 后对象属性变为空
【发布时间】:2016-05-04 23:42:22
【问题描述】:

我正在构建一个 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 的深层副本并不能修复它。

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 >

【问题讨论】:

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


    【解决方案1】:

    是否有可能达到总配额(或每个项目)?考虑在 set 回调上显示 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 未定义,这太奇怪了!
    • 您可以再试一次吗,但不要使用来自 Angular 的数据,而是使用您希望从中获得的值?正如@eholder0 所建议的那样,值的序列化可能没有正确完成。
    【解决方案2】:

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

    【讨论】:

    • 感谢您的回复!不幸的是,使用 "test" 而不是 storage_key 会产生相同的结果。
    • 对,因为您使用 storage_key 获取值,所以我认为它有效。我会看看你如何将任何值放入 settings.soundClip.selected (或类似的字典语法)中,因为这是唯一有问题的部分,只是为了清楚。很抱歉有任何混淆。
    • 是的,这可能很有趣,我已在原始问题中添加了其他信息!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-12
    • 2017-08-30
    相关资源
    最近更新 更多