Могу ли я хранить объекты класса javascript в индексированной базе данных? - PullRequest
0 голосов
/ 26 октября 2018

Я создал класс Book с конструктором и некоторыми методами.

class Book {
    constructor(title, author) {
        this.title = title;
        this.author = author;
    }

    displayInfo() {
        console.log(`Title: ${this.title}, Author: ${this.author}`);
    }
}

Затем я создал группу объектов Book и поместил их в массив с именем Library.

const book1 = new Book('Hobbit', 'JRR Tolkien');
const book2 = new Book('Mistborn', 'Brandon Sanderson');

let library = [];
library.push(book1);
library.push(book2);

console.log(library);
library.forEach(book => book.displayInfo());

Затем я сохранил этот библиотечный массив в indexeddb.

if (!window.indexedDB) {
    window.alert("IndexedDB doesn't work");
}

let request = indexedDB.open("Database", 1);
let db, tx, store;
request.onupgradeneeded = function(e) {
let db = request.result;
let store = db.createObjectStore('Collection', { keyPath: 'type' });
};
request.onerror = function(e) {
    console.log('error ' + e.target.errorCode);
};
request.onsuccess = function(e) {
    db = request.result;
    tx = db.transaction('Collection', 'readwrite');
    store = tx.objectStore('Collection');

    db.onerror = function(e) {
        console.log('error ' + e.target.errorCode);
    };
    console.log('adding do collection db');
    store.put({ type: 'library', data: library });

    tx.oncomplete = function() {
        db.close();
    };
};

Теперь я хотел бы восстанавливать этот массив после каждого обновления страницы и запускать методы Book для объектов, хранящихся в массиве.Но когда я восстановил данные, я увидел, что мои объекты Book больше не являются объектами Book, а являются обычными объектами, поэтому я не могу использовать методы Book для них.

if (!window.indexedDB) {
    window.alert("IndexedDB doesn't work");
}

let request = indexedDB.open("Database", 1);
let db, tx, store;
request.onupgradeneeded = function(e) {
    console.log('upgrading');
    let db = request.result;
    let store = db.createObjectStore('Collection', { keyPath: 'type' });
};
request.onerror = function(e) { console.log('error ' + e.target.errorCode); };
request.onsuccess = function(e) {
    console.log('success');
    db = request.result;
    tx = db.transaction('Collection', 'readwrite');
    store = tx.objectStore('Collection');

    db.onerror = function(e) { console.log('error ' + e.target.errorCode); };

    let retrievedData = store.get('library');

    retrievedData.onsuccess = function(e) {
        if (retrievedData.result) console.log(retrievedData);
        if (retrievedData.result) library = retrievedData.result.data;

        console.log(library);
        library.forEach(book => book.displayInfo());
    }

    tx.oncomplete = function() {
        db.close();
    };
};

Есть ли решение этой проблемы?

С уважением, Оскар

1 Ответ

0 голосов
/ 26 октября 2018

Это не очень хорошая практика, но после получения объекта библиотеки вы можете попробовать:

retrievedData.onsuccess = function(e) {
    if (retrievedData.result) console.log(retrievedData);
    if (retrievedData.result) library = retrievedData.result.data;
    const fixedLibrary = library.map(book => Object.setPrototypeOf(book, Book.prototype))
    fixedLibrary.forEach(book => book.displayInfo());
}

Хотя я бы порекомендовал вам не использовать классы, если вы собираетесь хранить экземпляры в базе данных, номодульно-ориентированный подход ...

...