Не удалось выполнить «add» для «IDBObjectStore» - PullRequest
0 голосов
/ 27 июня 2019

Я пытаюсь добавить объект javascript (конструктор функции) в IndexedDB , но получаю ошибку

Не удалось выполнить «add» для «IDBObjectStore»: function () { this.mapHierachyString = this.mapHierachyString.replace (/> / g, "|"); // CHUSJ | Блок 5 | B ......} не может быть клонирован.

Что-то не так в следующем коде:

      $.ajax({
          url: '/Review/GetDynamicPositions',
          type: 'POST',
          data: {
              ProfileId: profileId,
              DateDebut: dateDebut,
              DateFin: dateFin
          },
          
          success: function (reponse) {

              if (reponse.indexOf("Erreur") < 0) 
              {
                  review = new Review(profileId);
                  const dynamicPositions = JSON.parse(reponse);
                  dynamicPositions.forEach(dynamic => {
                      const dynamicPosition = new DynamicPosition();
                      dynamicPosition.positionX = dynamic.PositionX;
                      dynamicPosition.positionY = dynamic.PositionY;
                      dynamicPosition.floorId = dynamic.FloorId;
                      dynamicPosition.zoneId = dynamic.ZoneId;
                      dynamicPosition.mapHierachyString = dynamic.MapHierchString;

                      dynamicPosition.changeMapString();
                      review.addDynamicPosition(dynamicPosition);
                  });

                  //..Sauvegarder le review dans la BD
                  sauvegarderReview(review);
              }

          }

      });



function sauvegarderReview(review) 
{
        const transcation = db.transaction('ReviewStore', 'readwrite');
        const store = transcation.objectStore('ReviewStore');

        //..Ajouter dans la BD
        const request = store.add(review);

        request.onsuccess = function (e) 
        {
            console.log('Sauvegarder avec success');
        };

        request.onerror = function (e) {
            console.log("Error", e.target.error.name);

        };
}

//Review object 
function Review(profileId)
{
        this.profileId = profileId;
        this.dynamicPositions = [];

        this.addDynamicPosition = function (dynamicPosition) 
        {
            this.dynamicPositions.push(dynamicPosition);
        }

}

//DynamicPosition object 
function DynamicPosition() 
{
      this.positionX = 0;
      this.positionY = 0;
      this.mapHierachyString = ''; //CHUSJ>Bloc 5>B
      this.floorId = 0;
      this.zoneId = '';

      this.changeMapString = function () {
          this.mapHierachyString = this.mapHierachyString.replace(/>/g, "|"); 
          this.mapHierachyString = this.mapHierachyString.replace(/ /g, "_");
      }


}

1 Ответ

1 голос
/ 27 июня 2019

В спецификации сказано:

Каждая запись связана со значением. Пользовательские агенты должны поддерживать любой сериализуемый объект . Сюда входят простые типы, такие как значения примитивов String и объекты Date, а также экземпляры Object и Array, объекты File, объекты Blob, объекты ImageData и т. Д.

По сути, это означает, что объекты, которые вы сохраняете в IndexedDB, могут содержать только ограниченное подмножество всех возможных переменных. Функции - это одна из вещей, которые не могут быть сохранены в IndexedDB. И согласно сообщению об ошибке, которое вы разместили, в вашем review объекте должна быть функция.

Если вы хотите сохранить данные из review в IndexedDB, вам придется каким-то образом преобразовать их, чтобы они не включали функции или любые другие проблемные типы данных.

...