0

我正在使用帶有需要在Chrome會話中保留的書籤標記系統信​​息的對象,因此我試圖將其保存到本地存儲,每當創建新書籤時更新它。將對象保存到Chrome存儲但在檢索時獲得不同結果

當我創建一個新的書籤時,我會觸發一個函數來查看是否有任何其他具有與新書籤相同標籤的書籤。這將書籤組織成「標籤組」,功能類似於動態文件夾。

當我設置存儲對象時,存儲的對象具有我期望的所有數據。但是,只要我將相同的對象從存儲中取出,其中一個嵌套對象神祕地變爲null。請參閱控制檯輸出:頂部對象位於函數updateStorage中的設置調用之前。底部是我從存儲中「獲取」該對象時返回的內容。注意tagGroups書籤現在爲空。書籤本身仍然存在,只有在標籤組對象中它們纔會消失。我花了整整一整天的時間,試圖讓它運作起來。

console output

下面是型號代碼。我包含了上下文的所有內容,但最相關的部分是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")}); 
} 
+0

如果你'的console.log(JSON.stringify(........ 。)''在'chrome.storage.sync.set'之前,輸出是否包含這些對象? – wOxxOm

+0

也許你正在達到[sync quota](https://developer.chrome.com/extensions/storage#properties)限制:每個項目還是總數? – wOxxOm

+0

@wOxxOm我想過,但我沒有得到相應的運行時錯誤(和我的測試數據對象真的很小)。控制檯確實顯示正確的對象。 – brianpgerson

回答

1

你總是設置this.tagGroupsundefined當你從同步存儲檢索數據:

PrimaryBookmarksTree.prototype.findOrCreate = function(result){ 
    if (result.bookmarksTree != undefined){ 
     this.bookmarks = result.bookmarksTree.bookmarks; 
     this.title = result.bookmarksTree.title; 
     this.tagGroups = result.tagGroups; // should be result.bookmarksTree.tagGroups 
     console.log(this); 
    } 
} 
+0

啊,是的,謝謝。我測試了一下,如果tagGroups是bookmarksTree中的一個單獨的存儲對象,並且以後忘記了在沒有工作時切換回來,那麼標記組的書籤是否仍然爲空。但是,一旦我解決了這個疏忽,我仍然會陷入空虛......並且慢慢地瘋狂。 – brianpgerson

+0

只是一個問題,你是否提取了underscorejs函數的一個子集,並將它們定義在你的'PrimaryBookmarksTree'對象上?因爲我看到你正在使用'pluck'和'filter',但在'this'上? – rd3n

+0

是的,我正在爲另一個練習項目重新實現下劃線,並決定將它們寫入我的對象中,而不是將整個庫用於幾個簡單函數。這是一個壞主意,還是沒有這種背景就有點怪異? – brianpgerson

相關問題