Привет, я слежу за этот учебник, и теперь я не могу удалить запись из базы данных firebase в реальном времени.
(обновлено 11 июня 2018 г.) - ранее я подозревал, что эта ошибка возникает, когда я использую FirebaseListObservable, однако оказалось, что ошибка также возникает при использовании AngularFireList.
Runtime Error
_this.produkkuListRef.remove is not a function
Это страница с функцией удаления:
флекс-биснис-produkku.module.ts
import { Component } from '@angular/core';
import { IonicPage, NavController, NavParams, ActionSheetController } from 'ionic-angular';
import { AngularFireDatabase, AngularFireList } from 'angularfire2/database';
import { ProdukItem } from '../../models/produk-item/produk-item.interface';
@IonicPage()
@Component({
selector: 'page-fleks-bisnis-produkku',
templateUrl: 'fleks-bisnis-produkku.html',
})
export class FleksBisnisProdukkuPage {
produkkuList: AngularFireList<ProdukItem[]>;
constructor(public navCtrl: NavController, public navParams: NavParams, private database: AngularFireDatabase,
private actionSheetCtrl: ActionSheetController) {
this.produkkuListRef = this.database.list('produk-list').valueChanges();
console.info(this.produkkuListRef);
}
selectProdukItem(produkItem: ProdukItem){
this.actionSheetCtrl.create({
title: `${produkItem.itemName}`,
buttons:[
{
text: 'Edit',
handler: () => {
// send the user to the EditProdukItemPage and pass the key as a parameter
}
},
{
text: 'Delete',
role: 'destructive',
handler: () => {
//delete the current ProdukItem, passed in via the parameter
console.info(this.produkkuListRef);
this.produkkuListRef.remove(produkItem.$key);
}
},
{
text: 'Cancel',
role: 'cancel',
handler: () => {
console.info("The user has selected the cancel button");
}
}
]
}).present();
}
pushToTambahProduk(){
this.navCtrl.push('FbTambahProdukPage')
}
ionViewDidLoad() {
console.info('ionViewDidLoad FleksBisnisProdukkuPage');
}
}
Runtime Error
_this.produkkuListRef$.remove is not a function
Это страница с функцией удаления:
флекс-биснис-produkku.module.ts
import { Component } from '@angular/core';
import { IonicPage, NavController, NavParams, ActionSheetController } from 'ionic-angular';
import { AngularFireDatabase, FirebaseListObservable } from 'angularfire2/database';
import { ProdukItem } from '../../models/produk-item/produk-item.interface';
@IonicPage()
@Component({
selector: 'page-fleks-bisnis-produkku',
templateUrl: 'fleks-bisnis-produkku.html',
})
export class FleksBisnisProdukkuPage {
produkkuListRef: FirebaseListObservable<ProdukItem[]>;
constructor(public navCtrl: NavController, public navParams: NavParams, private database: AngularFireDatabase,
private actionSheetCtrl: ActionSheetController) {
this.produkkuListRef$ = this.database.list('produk-list').valueChanges();
console.info(this.produkkuListRef$);
}
selectProdukItem(produkItem: ProdukItem){
this.actionSheetCtrl.create({
title: `${produkItem.itemName}`,
buttons:[
{
text: 'Edit',
handler: () => {
// send the user to the EditProdukItemPage and pass the key as a parameter
}
},
{
text: 'Delete',
role: 'destructive',
handler: () => {
//delete the current ProdukItem, passed in via the parameter
console.info(this.produkkuListRef$);
this.produkkuListRef$.remove(produkItem.$key);
}
},
{
text: 'Cancel',
role: 'cancel',
handler: () => {
console.info("The user has selected the cancel button");
}
}
]
}).present();
}
pushToTambahProduk(){
this.navCtrl.push('FbTambahProdukPage')
}
ionViewDidLoad() {
console.info('ionViewDidLoad FleksBisnisProdukkuPage');
}
}
это мой интерфейсный файл, который импортируется на страницу выше
produk-item.interface.ts
export interface ProdukItem{
$key?: string;
itemName: string;
itemHarga: number;
}
это мой файл package.json:
{
"name": "go-fleksales",
"version": "0.0.1",
"author": "Ionic Framework",
"homepage": "http://ionicframework.com/",
"private": true,
"scripts": {
"clean": "ionic-app-scripts clean",
"build": "ionic-app-scripts build",
"lint": "ionic-app-scripts lint",
"ionic:build": "ionic-app-scripts build",
"ionic:serve": "ionic-app-scripts serve"
},
"dependencies": {
"@angular/animations": "5.2.10",
"@angular/common": "5.2.10",
"@angular/compiler": "5.2.10",
"@angular/compiler-cli": "5.2.10",
"@angular/core": "5.2.10",
"@angular/forms": "5.2.10",
"@angular/http": "5.2.10",
"@angular/platform-browser": "5.2.10",
"@angular/platform-browser-dynamic": "5.2.10",
"@ionic-native/core": "4.7.0",
"@ionic-native/splash-screen": "4.7.0",
"@ionic-native/status-bar": "4.7.0",
"@ionic/pro": "1.0.20",
"@ionic/storage": "2.1.3",
"angularfire2": "^5.0.0-rc.10",
"firebase": "^5.0.4",
"ionic-angular": "3.9.2",
"ionicons": "3.0.0",
"rxjs": "^6.2.0",
"rxjs-compat": "^6.2.0",
"sw-toolbox": "3.6.0",
"zone.js": "0.8.26"
},
"devDependencies": {
"@ionic/app-scripts": "3.1.9",
"typescript": "~2.6.2"
},
"description": "An Ionic project"
}
Я искал в Google, и мне кажется, что мой код правильный. Что могло вызвать эту ошибку?
Спасибо большое за вашу помощь.






Вы объявляете this.produkkuListRef$ следующим образом:
this.produkkuListRef$ = this.database.list('produk-list').valueChanges();
Согласно док, он возвращает «Observable данных в виде синхронизированного массива объектов JSON».
Вы не можете вызвать remove() для этого объекта, вы должны сделать это в самом списке, например:
this.produkkuList1Ref$ = this.database.list('produk-list');
....
this.produkkuList1Ref$.remove(produkItem.$key)
см. этот часть документа.
Привет, Рено, я обновил свой пост выше. Оказывается, сообщение об ошибке сохраняется независимо от использования FirebaseListObservable или AngularFireList. Есть ли другой возможный обходной путь?
@ BrianIvanderT.P. К сожалению, я не очень хорошо разбираюсь в angularfire, но я бы попытался воспроизвести пример, который вы нашли в документе: «Удаление всего списка» в github.com/angular/angularfire2/blob/master/docs/rtdb/lists. md.
Привет, Рено, попробовал «Удалить весь список», не указав ключевой параметр, но ошибка Runtime Error _this.produkkuListRef$.remove is not a function все еще сохраняется. Большое спасибо за уделенное время.
@ BrianIvanderT.P. Извините, я не был на 100% ясен в своем последнем комментарии. Когда я предлагаю вам попытаться воспроизвести этот пример, я на самом деле не в том, чтобы изменить способ вызова remove, а в начале примера, в том, как они объявляют AngularFireList и this.items. Опять же, я не очень хорошо разбираюсь в angularfire, поэтому рассматривайте это как метод проб и ошибок ...
Привет, Рено, спасибо за ответ. Как ваше предложение, я удалил
.valueChanges(), поэтому он сталthis.produkkuListRef$ = this.database.list('produk-list');. Однако при загрузке страницы он возвращает еще одну ошибку (еще до того, как я вызываю функцию удаления)Uncaught (in promise): Error: InvalidPipeArgument: '[object Object]' for pipe 'AsyncPipe'. Эта проблема уже решена в другой поток.