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})
}
}
});
Nicht viel klar über Ihre Frage, könnten Sie bitte mehr Code zur Verfügung stellen, wie Sie Group.js verwenden? –
Ich habe den Beitrag bearbeitet und das Skript background.js hinzugefügt, um mehr Kontext zu erhalten. – SamG
Was ist die Fehlerinfo? Wenn Sie 'currentGroup.containsUrl' aufrufen, wurde' currentGroup' initialisiert? Wann wird die Nachricht an die Hintergrundseite gesendet? –