7

Sto costruendo un'estensione di Chrome e ho riscontrato un errore che non riesco a comprendere. Il problema è una proprietà di un singolo oggetto che diventa null nella memoria di chromi.La proprietà dell'oggetto diventa nulla dopo chrome.storage.sync.set

sto testando questo facendo:

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

Questa è l'uscita:

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

Memorizzazione JSON.parse(JSON.stringify(obj)) invece di obj sembra direttamente per risolvere questo problema. Qualcuno ha qualche idea su cosa potrebbe causare questo? Qualsiasi aiuto è apprezzato!

Modifica: Effettuare una copia profonda di obj non risolve il problema.

Edit2: Dovrei espandere come è impostato settings.soundClip. Sto usando Angular (1.x) e sto usando una direttiva di selezione personalizzata. La direttiva ridotta si presenta così:

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

vista modello di direttiva (mySelect.html):

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

Le proprietà sono poi due vie bound in questo modo:

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

risposta

0

Dal chiamando JSON .parse (JSON.stringify (obj)) sembra risolverlo, suppongo che tu abbia un problema con la codifica dell'oggetto impostazioni con una variabile anziché una stringa. Vedere la risposta here che potrebbe aiutare.

+0

Grazie per la risposta! Sfortunatamente, usando '" test "' invece di 'storage_key' si ottengono gli stessi risultati. – Easypeasy

+0

Esatto, e dal momento che si ottiene il valore usando storage_key, presumo che funzioni. Vorrei vedere come si sta mettendo qualsiasi valore in settings.soundClip.selected (o sintassi del dizionario simile) anche se poiché questa è l'unica parte che presenta il problema, tanto per essere chiari. Ci scusiamo per qualsiasi confusione. – eholder0

+0

Sì, questo può essere interessante, ho aggiunto ulteriori informazioni alla domanda originale! – Easypeasy

0

È possibile che la quota totale (o per articolo) venga colpita? Considera di visualizzare runtime.lastError sul callback impostato per vedere se ci sono messaggi di errore.

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

Vedere i limiti qui chrome.storage.sync.set

+0

Ehi, grazie per la risposta! Dubito che sia perché sto colpendo un limite, l'oggetto è 434 byte. 'chrome.runtime.lastError' non è definito, è tutto troppo strano! – Easypeasy

+1

Puoi riprovare, ma invece di utilizzare i dati di Angular, utilizza i valori che ci si aspetta di ottenere da esso? È possibile che la serializzazione dei valori non venga eseguita correttamente come suggerisce @ eholder0. –

Problemi correlati