7

クロム拡張機能をビルドしていて、バグが発生しました。この問題は、クロムの保存でnullになる単一のオブジェクトプロパティです。chrome.storage.sync.setの後にObjectプロパティが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]); 
    }); 
}); 

をこれが出力されます。JSON.parse(JSON.stringify(obj))の代わりobjを保存

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 
    } 
} 

は、直接この問題を解決するようです。誰でもこれを引き起こす可能性のあるアイデアはありますか?どんな助けもありがとう!

編集:objの深いコピーを作成しても修正されません。

Edit2:settings.soundClipがどのように設定されているかを拡張する必要があります。私はAngular(1.x)を使用していますが、私はカスタムselectディレクティブを使用しています。 JSONを呼び出すので

<my-select selected="settings.soundClip.selected" 
      options="settings.soundClip.options"> 
</my-select > 

答えて

0

:プロパティは、2つのウェイはこのようにバインドされている

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

function mySelect() { 
    return { 
     restrict: "E", 
     templateUrl: "mySelect.html", 
     scope: { 
      options: "=", 
      selected: "=" 
     }, 
     link: function (scope) { 
      scope.select = function (item) { 
       scope.selected = item; 
      }; 
     } 
    } 
} 

指令テンプレートビュー(mySelect.html):ストリップダウンディレクティブは、このようになります。 .parse(JSON.stringify(obj))はそれを修正するようですが、私の推測では、設定オブジェクトを文字列ではなく変数でエンコードする際に問題が発生していると思われます。参考になる回答hereを参照してください。

+0

感謝を参照してください!残念ながら、 'storage_key'の代わりに' 'test" 'を使うと同じ結果が得られます。 – Easypeasy

+0

右、storage_keyを使って値を取得しているので、私はそれが動作すると仮定します。私はsettings.soundClip.selected(または同様の辞書構文)にどのような値を入れているかを見ていきますが、これは問題を抱えている唯一の部分だからです。混乱を招いて申し訳ありません。 – eholder0

+0

これは興味深いかもしれませんが、私は元の質問に追加情報を追加しました! – Easypeasy

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

+0

お返事ありがとう!私は限界を打つので、それは疑問です、オブジェクトは434バイトです。 'chrome.runtime.lastError'は未定義ですが、これはすべて奇妙です! – Easypeasy

+1

もう一度やり直すことができますが、Angularのデータを使用する代わりに、取得したい値を使用しますか? @ eholder0が示唆するように、値の直列化が正しく行われていない可能性があります。 –

関連する問題