Nano Hash - криптовалюты, майнинг, программирование

Удаление документов из коллекции с помощью Angular в Firestore

Я пытаюсь удалить документ и вложенные в него документы в коллекции внутри документа в Firestore в Firebase с помощью Angular. На данный момент я могу удалить указанный документ и коллекцию, но не без того, чтобы компилятор не выдал мне ошибку error TS2339: Property 'id' does not exist on type '{}'. Код ошибки может быть правильным или неправильным, я, честно говоря, не знаю, так как мой код находит идентификатор, связанный с объектом, на который я смотрю. Это мой код:

testID: string;
private testDoc: AngularFirestoreDocument<Test>;

constructor(private db: AngularFirestore) { }

deleteDoc() {
    console.log('Deleting test');
    this.db.collection(`tests/${this.testID}/questions`, ref => ref.orderBy('order'))
        .valueChanges().subscribe(questions => {
            questions.map(question => {
                this.db.doc(`tests/${this.testID}/questions/${question.id}`).delete()
                    .catch(error => {console.log(error); })
                    .then(() => console.log(`tests/${this.testID}/questions/${question.id}`));
            });
        });
        this.testDoc.delete().catch(error => console.log(error));
    }

Я также попытался передать 2 аргумента в функцию карты, но это просто вызывает ошибки в выполняемой функции вместо компилятора, что приводит к тому, что код вообще не работает (я мог бы передать здесь неправильную вещь).

Как я уже упоминал, мой код работает, но я определенно делаю что-то не так. Итак, мой вопрос: что я делаю не так, чтобы вызвать ошибку компиляции, и как мне избежать этого, убедившись, что функция по-прежнему работает? Надеюсь, кто-то поможет прояснить, что я здесь делаю неправильно.

Заранее спасибо.

* Edit, включил документ, который я просматриваю

export interface Question {
    description: string;
    order: number;
    type: string;
    id: string;
    name: string;
    options?: Object[];
    radio_amount?: number;
    current_chips?: Object[];
    imageURL?: string;
}

  • у вашего question.id есть поле id или вы ждете ключ? 21.11.2017
  • У него есть идентификатор поля, я считаю, что да. Я обновил вопрос, чтобы включить то, на что я смотрю. 21.11.2017
  • что делает эта часть кода this.testDoc.delete()? 21.11.2017
  • Тест является основным документом, а вопросы - вложенными документами в коллекции, вложенной в основной документ. Это удаление документа с вложенной коллекцией, которая является вопросами. Однако при удалении документа вложенные коллекции не удаляются. 21.11.2017
  • похоже, что вы только что заявили об этом, и ничего с ним не связано. тогда как удалить работают? 22.11.2017
  • Извините, сэр, ваш вопрос меня смущает. Функция, в которой вы спрашиваете, делает именно то, что должна делать, она удаляет документ, на который есть ссылка как testDoc, что отлично работает. Другая часть кода собирает идентификаторы документов в коллекции, вложенной в тестовый документ. Затем он удаляет каждый документ, ссылаясь на question.id из документа, который является именем документа. 22.11.2017
  • Эта ошибка довольно явная: в ней говорится, что в вашем вопросе нет свойства id. Вы либо не сохраняете свой вопрос id в Firebase, либо, если вам нужен ключ, предоставленный Firebase, вы не отображаете его как примеры документов. 22.11.2017
  • Я уже сохраняю ключ как идентификатор в Firebase, и он есть, и вышеупомянутый код работает. Ошибка появляется только во время компиляции, но код все еще компилируется, и функция правильно удаляет вложенные документы. Идентификатор существует, иначе невозможно удалить ни один из документов. 22.11.2017

Ответы:


1

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

Я исправил свою ошибку, добавив тип, показанный в моем коде здесь. Теперь код работает так же, как и раньше, И он не выдает мне ошибки компилятора.

deleteDoc() {
    this.db.collection(`tests/${this.testID}/questions`,
        ref => ref.orderBy('order')).valueChanges().subscribe(questions => {
        questions.map((question: Question) => {
            this.db.doc(`tests/${this.testID}/questions/${question.id}`).delete()
                .catch(error => {console.log(error); })
                .then(() => console.log(`Deleting question (${question.id}) in (${this.testID})`));
        });
    });
    this.testDoc.delete().catch(error => console.log(error)).then(() => console.log(`${this.testID} has been deleted.`));
}

Я ценю помощь, которую некоторые из вас пытались мне оказать, но, похоже, вы были более сосредоточены на том факте, что мой код не работал, хотя этого никогда не было или вопроса. Внимание было сосредоточено на ошибке, которую я указал в вопросе, заданном компилятором, несмотря на то, что функция работает, и на том, как правильно написать код, чтобы не выдавать ошибку.

Поднимите голову, я не рекомендую использовать вышеупомянутую функцию, поскольку она в настоящее время выполняется, когда я подписан на сборник вопросов, и, таким образом, также запускает код еще несколько раз, поскольку значение изменяется, когда я удаляю документы во время функции. Работает, но не оптимизирован.

22.11.2017
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..