2016-04-25 1 views
0

Я создал пользовательский объект, который я использую в своем расширении. Когда я сохраняю объекты типа Group (мой тип объекта), а затем вытаскиваю эти объекты из хранилища, кажется, что методы прототипа больше не присутствуют. Теперь я прочитал в документации, что объекты сериализуются до объектных литералов {}, и я не могу понять, как сохранить методы с объектами. Я привел код класса группы ниже. Когда я пытаюсь использовать один из методов из приведенного ниже файла на объекте, который был извлечен из хранилища, я получаю сообщение об ошибке, что функция не существует. Я использовал цикл for для цикла для всех свойств, и объект имеет свойство name и urls. Любая помощь будет принята с благодарностью!Хром Расширение Хранение пользовательских типов объектов Способы прототипов

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:

Вот сценарий background.js, он показывает, как объект извлекается, а затем, как это называется в сценарии. Он терпит неудачу, когда он получает сообщение addUrl и пытается вызвать containsUrl() на currentGroup.

// 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

Не очень ясно о вашем вопросе, не могли бы вы предоставить больше кода, например, как вы используете Group.js? –

+0

Я отредактировал сообщение и добавил background.js скрипт, чтобы дать ему больше контекста – SamG

+0

Что такое информация об ошибке? Когда вы вызываете 'currentGroup.containsUrl', инициализируется' currentGroup'? Когда будет отправлено сообщение на справочную страницу? –

ответ

1

Я считаю, что в настоящее время chrome.storage используется только для сохранения объектов ключ-значение, не включая прототип/функций. Однако я не нашел официальных документов об этом.

Обходное решение будет использовать Group.prototype.containsUrl.call(currentGroup, sender.url), оно позволяет вызывать containsUrl с указанием контекста для "this".

+0

Спасибо! Это позволило вызвать функцию и, похоже, работает до сих пор. Я потратил часы, пытаясь понять это, очень ценю! – SamG

+0

@SamG, рад помочь, однако, я не уверен в этом, так как 'chrome.storage' можно использовать для сохранения объектов, но, похоже, поддерживается только ключевое значение. Мы можем подождать и посмотреть, сможет ли кто-то другой дать лучшее объяснение. –

+0

На данный момент я оставлю ваш ответ как правильный, поскольку это единственное решение, которое для меня работало до сих пор, если появится еще одно лучшее решение, которое я обновлю! Еще раз спасибо, что я смог добиться прогресса сейчас, когда я прошел мимо этой ошибки – SamG

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