2016-04-25 9 views
0

Ich habe ein benutzerdefiniertes Objekt erstellt, das ich in meiner Erweiterung verwende. Wenn ich Objekte des Typs Gruppe (mein Objekttyp) speichere und diese Objekte später aus dem Speicher herausnehme, scheinen die Prototypmethoden nicht mehr vorhanden zu sein. Jetzt lese ich in der Dokumentation, dass Objekte zu Objektliteralen {} serialisieren und ich kann nicht scheinen, herauszufinden, wie man die Methoden mit den Objekten behält. Ich habe den Code der Gruppenklasse unten angegeben. Wenn ich versuche, eine der Methoden aus der Datei unten für ein Objekt zu verwenden, das aus dem Speicher abgerufen wurde, erhalte ich den Fehler, dass die Funktion nicht existiert. Ich habe eine For-In-Schleife verwendet, um alle Eigenschaften zu durchlaufen, und das Objekt hat die Namen- und URL-Eigenschaft. Jede Hilfe würde sehr geschätzt werden!Chrome Extension Speichern von benutzerdefinierten Objekttypstreifen Prototypmethoden

Group.js:

// Create the Group class 
var Group = function (name, urls) { 
    this.name = name; 
    this.urls = urls; 
}; 

// Clears all urls from the group 
Group.prototype.clearUrls = function() { 
    this.urls = []; 
}; 

// Adds the specified url to the group 
Group.prototype.addUrl = function (url) { 
    this.urls.append(url); 
}; 

// Removes the specified url from the group 
Group.prototype.removeUrl = function (url) { 
    this.urls = this.urls.filter(function(_url){ 
    return url !== _url; 
    }); 
}; 

// Renames the group 
Group.prototype.rename = function (name) { 
    this.name = name; 
}; 

// Checks whether or not the group contains the specified url 
// Returns either true or false 
Group.prototype.containsUrl = function (url) { 
    var contains = false; 
    for (var i = 0; i < this.urls.length; i++) { 
    if (this.urls[i] === url) { 
     contains = true; 
     break; 
    } 
    } 
    return contains; 
}; 

EDIT:

Hier ist das background.js Skript, es zeigt, wie das Objekt abgerufen wird, und dann, wie es später im Skript aufgerufen. Es schlägt fehl, wenn es die Nachricht addUrl empfängt und versucht, containsUrl() für currentGroup aufzurufen.

// Global Variables 
var currentGroup; 
var groups = []; 
var options = []; 

// Short hand function to save the current data to storage 
var saveData = function() { 
    // Save default options, currrentGroup, and groups 
    chrome.storage.sync.set({'options': options, 'currentGroup': currentGroup, 'groups': groups}, function() { 
    if (chrome.runtime.lastError) { 
     console.error("Could not save because: " + chrome.runtime.lastError); 
    } 
    }); 
} 

// On start query for saved data to make sure data is current 
chrome.storage.sync.get(function(items) { 
    // Check if there are groups 
    if (items['groups']) { // Set the groups 
    groups = items['groups']; 
    } else { // Create default group and add to list of groups 
    currentGroup = new Group('default', []); 
    groups = [currentGroup]; 
    } 

    // Check for current group, if none set to first available group 
    if (items['currentGroup']) { 
    currentGroup = items['currentGroup']; 
    console.log(Object.getOwnPropertyNames(currentGroup)); 
    } else { 
    currentGroup = groups[0]; 
    } 

    // Check for the options 
    if (items['options']) { 
    options = items['options']; 
    } else { 
    // No options, set the default options and save them 
    options['overrideHomepages'] = true; 
    } 

    saveData(); 

    // After data has been fetched bring up the tabs 
    chrome.tabs.query({'currentWindow': true}, function(tabs) { 
    for (var i = 0; i < currentGroup.urls.length; i++) { 
     if (options['overrideHomepages']) { 
     if (tabs[i].url.length > 0) { 
      chrome.tabs.update(tabs[0].id, {'url': currentGroup.urls[i]}); 
     } else { 
      chrome.tabs.create({'url': currentGroup.urls[i]}); 
     } 
     } else { // Don't override homepages or open tabs 
     chrome.tabs.create({'url': currentGroup.urls[i]}); 
     } 
     currentGroup.urls[i] 
    } 
    }); // End tabs.query 

}); // End storage.sync.get 

// Add message listener 
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) { 

    // If add url was sent 
    if (request.message === 'addUrl') { 
    console.log('Recieved message: ' + request.message); 
    // Check if the group contains the url already 
    if (currentGroup.containsUrl(sender.url) === false) { 
     currentGroup.addUrl(sender.url); 
     saveData(); 
     sendResponse({'message': 'Saved ' + sender.url}); 
    } 
    } 

    // If remove url was sent 
    if (request.message === 'removeUrl') { 
    // Check if the group contains the url 
    if (currentGroup.containsUrl(sender.url)) { 
     currentGroup.removeUrl(sender.url); 
     saveData(); 
     sendResponse({'message': 'Removed ' + sender.url}) 
    } 
    } 
}); 
+0

Nicht viel klar über Ihre Frage, könnten Sie bitte mehr Code zur Verfügung stellen, wie Sie Group.js verwenden? –

+0

Ich habe den Beitrag bearbeitet und das Skript background.js hinzugefügt, um mehr Kontext zu erhalten. – SamG

+0

Was ist die Fehlerinfo? Wenn Sie 'currentGroup.containsUrl' aufrufen, wurde' currentGroup' initialisiert? Wann wird die Nachricht an die Hintergrundseite gesendet? –

Antwort

1

Ich glaube, zur Zeit chrome.storage wird nur verwendet, Schlüssel-Wert-Elemente zu speichern, ohne Prototyp/Funktionen. Ich habe jedoch keine offiziellen Dokumente darüber gefunden.

Eine Problemumgehung wäre die Verwendung Group.prototype.containsUrl.call(currentGroup, sender.url), ermöglicht es Ihnen, containsUrl mit Angabe des Kontexts für "this" aufrufen.

+0

Vielen Dank! Dadurch konnte die Funktion aufgerufen werden und es scheint so weit zu funktionieren. Ich verbrachte Stunden damit, das herauszufinden, sehr geschätzt! – SamG

+0

@SamG, ich bin froh, dass ich helfen kann, bin mir aber nicht sicher, da 'chrome.storage' verwendet werden kann, um Objekte zu speichern, aber es scheint nur der Schlüsselwert unterstützt zu werden. Wir können warten und sehen, ob jemand anderes eine bessere Erklärung geben kann. –

+0

Für jetzt werde ich Ihre Antwort als die richtige verlassen, da es die einzige Lösung ist, die für mich bisher funktioniert hat, wenn eine andere bessere Lösung kommt, die ich aktualisieren werde! Nochmals vielen Dank, ich konnte Fortschritte machen, nachdem ich diesen Fehler hinter mir habe – SamG

Verwandte Themen