我正在使用帶有需要在Chrome會話中保留的書籤標記系統信息的對象,因此我試圖將其保存到本地存儲,每當創建新書籤時更新它。將對象保存到Chrome存儲但在檢索時獲得不同結果
當我創建一個新的書籤時,我會觸發一個函數來查看是否有任何其他具有與新書籤相同標籤的書籤。這將書籤組織成「標籤組」,功能類似於動態文件夾。
當我設置存儲對象時,存儲的對象具有我期望的所有數據。但是,只要我將相同的對象從存儲中取出,其中一個嵌套對象神祕地變爲null
。請參閱控制檯輸出:頂部對象位於函數updateStorage
中的設置調用之前。底部是我從存儲中「獲取」該對象時返回的內容。注意tagGroups書籤現在爲空。書籤本身仍然存在,只有在標籤組對象中它們纔會消失。我花了整整一整天的時間,試圖讓它運作起來。
下面是型號代碼。我包含了上下文的所有內容,但最相關的部分是createNewBookmark,updatePrimaryTreeWithTagGroups和updateStorage方法。
更新:我編輯的代碼設置/獲取從存儲任何東西,然後作出最後呼籲更新與生成的對象存儲之前進行的所有更改,書籤樹。我實際上只是一次存儲一件東西,並且每當我嘗試檢索時都會找回另一件東西。
function PrimaryBookmarksTree(){
chrome.storage.sync.get(null, this.findOrCreate.bind(this));
}
PrimaryBookmarksTree.prototype.findOrCreate = function(result){
if (result.bookmarksTree != undefined){
this.bookmarks = result.bookmarksTree.bookmarks;
this.title = result.bookmarksTree.title;
this.tagGroups = result.bookmarksTree.tagGroups;
console.log(this);
} else {
this.bookmarks = [];
this.title = "Marinade Bookmarks";
this.tagGroups = [];
chrome.storage.sync.set({"bookmarksTree": this}, function(){console.log("New tree created!")});
console.log(this);
}
}
function Bookmark(name, tags, url){
this.name = name;
this.tags = tags;
this.url = url;
this.dateCreated = this.date();
}
function TagGroup(tag){
this.bookmarks = [];
this.tag = tag;
}
//called by controller when user tags a new bookmark via the extension
PrimaryBookmarksTree.prototype.createNewBookmark = function(name, tags, url){
var newBookmark = new Bookmark(name, tags, url);
this.bookmarks.push(newBookmark);
this.tagGroups = this.updatePrimaryTreeWithTagGroups();
this.updateStorage(this);
}
PrimaryBookmarksTree.prototype.updatePrimaryTreeWithTagGroups = function(){
var tagsForGrouping = this.getTagsWithMultipleBookmarks(this.bookmarks);
for(j=0;j<tagsForGrouping.length;j++){
this.tagGroups.push(this.buildTagGroup(tagsForGrouping[j]));
}
return this.tagGroups;
}
PrimaryBookmarksTree.prototype.getTagsWithMultipleBookmarks = function(bookmarks){
var tagsToCheck = this.pluck(bookmarks, "tags");
var tagCounts = tagsToCheck.reduce(function (obj, curr){
if (typeof obj[curr] == 'undefined') {
obj[curr] = 1;
} else {
obj[curr] += 1;
}
return obj;
}, {});
var tagGroups = this.filter(tagCounts, function(x){return x > 1});
return tagGroups;
}
PrimaryBookmarksTree.prototype.buildTagGroup = function(tag){
tagGroup = new TagGroup(tag);
for(i=0;i<this.bookmarks.length;i++){
if(this.bookmarks[i].tags[0] == tag){
tagGroup.bookmarks.push(this.bookmarks[i]);
}
}
if (tagGroup.bookmarks.length != 0){
return tagGroup;
}
}
PrimaryBookmarksTree.prototype.updateStorage = function(updatedTree){
console.log(JSON.stringify(updatedTree));
chrome.storage.sync.set({"bookmarksTree": updatedTree}, function(){console.log("final storage complete")});
}
如果你'的console.log(JSON.stringify(........ 。)''在'chrome.storage.sync.set'之前,輸出是否包含這些對象? – wOxxOm
也許你正在達到[sync quota](https://developer.chrome.com/extensions/storage#properties)限制:每個項目還是總數? – wOxxOm
@wOxxOm我想過,但我沒有得到相應的運行時錯誤(和我的測試數據對象真的很小)。控制檯確實顯示正確的對象。 – brianpgerson