7

Ich baue eine Verlängerung Chrom und haben einen Fehler gestoßen ich nicht meinen Kopf herum wickeln kann. Das Problem ist eine einzelne Objekteigenschaft, die in Chromes-Speicher null wird.Objekteigenschaft wird null nach chrome.storage.sync.set

Ich teste dies tun:

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]); 
    }); 
}); 

Dies ist die Ausgabe:

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

Speichern JSON.parse(JSON.stringify(obj)) statt obj scheint direkt dies zu beheben. Hat jemand irgendwelche Ideen, was das verursachen könnte? Jede Hilfe wird geschätzt!

Edit: eine tiefe Kopie von obj So dass es nicht beheben.

Edit2: Ich sollte auf erweitern, wie settings.soundClip gesetzt. Ich verwende Angular (1.x) und verwende eine benutzerdefinierte Auswahlanweisung. Die abgespeckte Richtlinie sieht wie folgt aus:

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

Richtlinie Vorlage Ansicht (mySelect.html):

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

Die Eigenschaften sind dann zwei-Wege wie folgt gebunden:

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

Antwort

0

Da JSON Aufruf .parse (JSON.stringify (obj)) scheint es zu beheben, meine Vermutung ist, dass Sie ein Problem sind, die mit der Kodierung der Einstellungen mit einem variablen Objekt anstelle einer Zeichenfolge. Siehe die Antwort here, die helfen könnte.

+0

Danke für die Antwort! Leider führt die Verwendung von "test" anstelle von "storage_key" zu denselben Ergebnissen. – Easypeasy

+0

Richtig, und da Sie den Wert mit storage_key aussteigen, nehme ich an, dass das funktioniert. Ich würde mir ansehen, wie Sie den Wert in settings.soundClip.selected (oder eine ähnliche Wörterbuchsyntax) setzen, da dies der einzige Teil ist, der das Problem hat, nur um klar zu sein. Entschuldigung für jede Verwirrung. – eholder0

+0

Ja, das könnte von Interesse sein, ich habe zusätzliche Informationen zur ursprünglichen Frage hinzugefügt! – Easypeasy

0

Ist es möglich, dass die gesamte Quote (oder pro Stück) getroffen wird? Erwägen Sie, den runtime.lastError auf dem Set-Callback anzuzeigen, um zu sehen, ob es Fehlermeldungen gibt.

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]); 
    }); 
}); 

Siehe die Grenzen hier chrome.storage.sync.set

+0

Hey, danke für die Antwort! Ich bezweifle es, weil ich ein Limit erreiche, das Objekt ist 434 Bytes. 'chrome.runtime.lastError' ist undefiniert, das ist alles zu seltsam! – Easypeasy

+1

Können Sie es erneut versuchen, aber anstatt die Daten von Angular zu verwenden, verwenden Sie die erwarteten Werte? Es ist möglich, dass die Serialisierung der Werte nicht richtig ausgeführt wird, wie @ eeholder0 vermuten lässt. –

Verwandte Themen