Как исправить ‘Item’ отсутствуют следующие свойства из типа ‘Item[]’: длина, всплывающее окно, нажатие, объединение и еще 26

#angular #typescript #firebase-realtime-database #angular6 #angularfire5

#angular #машинопись #firebase-realtime-database #angular6 #angularfire5

Вопрос:

Может кто-нибудь, пожалуйста, помочь это исправить? Я создаю CRUD-приложение через firebase, и я новичок в ts и firebase. Помогите мне, пожалуйста, я работаю над этим несколько дней. Спасибо

Мой ts-файл:

 import { Injectable } from '@angular/core';

import { Item } from './item';
import { AngularFireObject, AngularFireList, AngularFireDatabase } from 'angularfire2/database';
import * as firebase from 'firebase';



@Injectable()
export class ItemService {

  private basePath: string = '/items';

  items: AngularFireList<Item[]> = null;
  item: AngularFireObject<Item> = null;

  constructor(private db: AngularFireDatabase) { }

  getItemsList(query={}): AngularFireList<Item[]> {
    this.items = this.db.list('items', ref => ref.orderByChild('value'));
    return this.items
  }

  // Return a single observable item
getItem(key: string): AngularFireObject<Item> {
  const itemPath =  `${this.basePath}/${key}`;
  this.item = this.db.object(itemPath)
  return this.item
}


createItem(item: Item): void  {
  this.items.push(item)                        <--- here is the error
    .catch(error => this.handleError(error))
}


// Update an existing item
updateItem(key: string, value: any): void {
  this.items.update(key, value)
    .catch(error => this.handleError(error))
}

// Deletes a single item
deleteItem(key: string): void {
    this.items.remove(key)
      .catch(error => this.handleError(error))
}

// Deletes the entire list of items
deleteAll(): void {
    this.items.remove()
      .catch(error => this.handleError(error))
}

// Default error handling for all actions
private handleError(error) {
  console.log(error)
}

}
  

Ошибка в CreateItem (), и моя консоль выглядит так

ОШИБКА в src/app/items/shared/item.service.ts(31,19): ошибка TS2345: аргумент типа «Элемент» не может быть присвоен параметру типа «Элемент []». В типе ‘Item’ отсутствуют следующие свойства из типа ‘Item[]’: длина, всплывающее окно, нажатие, объединение и еще 26.

Комментарии:

1. В сообщении сказано все: аргумент типа ‘Item’ не может быть присвоен параметру типа ‘Item[]’. Метод push ожидает элемент [], то есть массив элементов. Но вы передаете элемент в качестве аргумента, то есть один элемент, а не массив.

Ответ №1:

AngularFire2, который вы использовали, работает с наблюдаемыми. пожалуйста, ознакомьтесь с документацией AngularFire2. Теперь ваша проблема в том, что items является наблюдаемым, а не массивом, поэтому вы пытаетесь присвоить значения неправильному типу, также, если вы пытаетесь перейти к базам данных, это не способ сделать это, и снова вам следует прочитать документацию и узнать, как работает Angularfire2

Ответ №2:

Попробуйте назначить наблюдаемое в ngOnInit(). Что-то вроде

 ngOnInit(){
this.items = this.db.list('items', ref => ref.orderByChild('value'))
}