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

Eas*_*asy 7 javascript google-chrome google-chrome-extension angularjs

我正在构建一个chrome扩展,并遇到了一个我无法绕过头的bug.问题是单个对象属性变为nullchromes的存储.

我正在测试这个:

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]);
    });
});
Run Code Online (Sandbox Code Playgroud)

这是输出:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

存储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;
            };
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

然后属性是双向绑定的,如下所示:

<my-select selected="settings.soundClip.selected"
           options="settings.soundClip.options">
</my-select >
Run Code Online (Sandbox Code Playgroud)

eho*_*er0 0

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