7

Я строю расширение хром и столкнулся с ошибкой, с которой я не могу окутать голову. Проблема заключается в одном объекте, которое становится null в хранилище хромов.Свойство объекта становится null после chrome.storage.sync.set

Я проверяю это, выполнив:

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 не исправляет ее.

Редактировать 2: Я должен расширить, как установить settings.soundClip. Я использую Angular (1.x), и я использую настраиваемую директиву select. Урезанная директива выглядит следующим образом:

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 > 

ответ

0

С вызова JSON .parse (JSON.stringify (obj)), кажется, исправить это, я предполагаю, что у вас возникла проблема с кодировкой объекта настроек с переменной вместо строки. См. Ответ here, который может помочь.

+0

Спасибо за ответ! К сожалению, использование '' test ''вместо' storage_key' дает те же результаты. – 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

Можете ли вы попробовать еще раз, но вместо использования данных из углового используйте значения, которые вы ожидаете получить от него? Возможно, что сериализация значений не выполняется правильно, как предлагает @ eholder0. –

Смежные вопросы