如何从离子列表中删除离子项目?
How to delete an ion-item from ion-list?
我正在尝试为存储在 Firestore 实例中的离子列表中的离子项实现删除功能。我试图用 .splice()
函数解决它,但这会引发以下错误:
Property 'splice' does not exist on type 'Observable<any[]>'.ts(2339)
有人知道如何解决这个问题吗?
代码如下所示:
HTML
<ion-item-sliding *ngFor="let space of spaces | async; let i = index">
<ion-item>
<ion-icon name="ellipse-outline"></ion-icon>
<ion-label>
{{ space.spaceName }}
</ion-label>
</ion-item>
<ion-item-options (ionSwipe)="deleteSpace(i)">
<ion-item-option color="success" (click)="editspacenameModal()">
Edit
</ion-item-option>
<ion-item-option color="danger" (click)="deleteSpace(i)" expandable>
Delete
</ion-item-option>
</ion-item-options>
</ion-item-sliding>
TS
export class ActivitiesPage implements OnInit {
spaces: Observable<any[]>;
...
deleteSpace(i) {
this.spaces.splice(i,1);
console.log('deleteSpace() called')
}
一种方法是转换您的可观察对象并将其过滤掉:
在此处阅读更多内容:
https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Array/filter
const data = this.yourdata.filter(item => item.property !== desiredvalue)
您还可以检测列表中的变化并直接过滤可观察对象。
在此处阅读更多内容:
https://www.learnrxjs.io/learn-rxjs/operators/filtering/filter
也许这个问题对你有帮助:
how to filter an Observable array?
您需要过滤实际的数组而不是包裹在它周围的可观察对象。因此,您会将 Observable 的内容(这是一个 any[])映射到过滤后的 spaces
.
deleteSpace(i) {
this.spaces = this.spaces.pipe(
map(result => result.filter((r, index) => i !== index))
)
console.log('deleteSpace() called')
this.spaces.subscribe((out) => console.log(out))
}
在 map
运算符中使用 filter
将解决您的问题。
我是这样解决的:
HTML
<ion-item-sliding *ngFor="let space of spaces | async">
<ion-item detail>
<ion-icon name="ellipse-outline" start></ion-icon>
<ion-label>
{{ space.spaceName }}
</ion-label>
</ion-item>
<ion-item-options (ionSwipe)="deleteSpace(space)">
<ion-item-option color="success" (click)="editspaceModal(space)"> Edit </ion-item-option>
<ion-item-option color="danger" (click)="deleteSpace(space)" expandable> Delete </ion-item-option>
</ion-item-options>
</ion-item-sliding>
TS
deleteSpace(space: Space): void {
console.log('space.id',space)
this.setisDeleted(space);
}
setisDeleted(space): Promise<any> {
const isDeleted = true;
return this.angularFirestore
.collection('accounts')
.doc(this.userId)
.collection("spaces")
.doc(space.spaceId)
.update({ isDeleted })
}v
我正在尝试为存储在 Firestore 实例中的离子列表中的离子项实现删除功能。我试图用 .splice()
函数解决它,但这会引发以下错误:
Property 'splice' does not exist on type 'Observable<any[]>'.ts(2339)
有人知道如何解决这个问题吗?
代码如下所示:
HTML
<ion-item-sliding *ngFor="let space of spaces | async; let i = index">
<ion-item>
<ion-icon name="ellipse-outline"></ion-icon>
<ion-label>
{{ space.spaceName }}
</ion-label>
</ion-item>
<ion-item-options (ionSwipe)="deleteSpace(i)">
<ion-item-option color="success" (click)="editspacenameModal()">
Edit
</ion-item-option>
<ion-item-option color="danger" (click)="deleteSpace(i)" expandable>
Delete
</ion-item-option>
</ion-item-options>
</ion-item-sliding>
TS
export class ActivitiesPage implements OnInit {
spaces: Observable<any[]>;
...
deleteSpace(i) {
this.spaces.splice(i,1);
console.log('deleteSpace() called')
}
一种方法是转换您的可观察对象并将其过滤掉:
在此处阅读更多内容:
https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Array/filter
const data = this.yourdata.filter(item => item.property !== desiredvalue)
您还可以检测列表中的变化并直接过滤可观察对象。
在此处阅读更多内容:
https://www.learnrxjs.io/learn-rxjs/operators/filtering/filter
也许这个问题对你有帮助:
how to filter an Observable array?
您需要过滤实际的数组而不是包裹在它周围的可观察对象。因此,您会将 Observable 的内容(这是一个 any[])映射到过滤后的 spaces
.
deleteSpace(i) {
this.spaces = this.spaces.pipe(
map(result => result.filter((r, index) => i !== index))
)
console.log('deleteSpace() called')
this.spaces.subscribe((out) => console.log(out))
}
在 map
运算符中使用 filter
将解决您的问题。
我是这样解决的:
HTML
<ion-item-sliding *ngFor="let space of spaces | async">
<ion-item detail>
<ion-icon name="ellipse-outline" start></ion-icon>
<ion-label>
{{ space.spaceName }}
</ion-label>
</ion-item>
<ion-item-options (ionSwipe)="deleteSpace(space)">
<ion-item-option color="success" (click)="editspaceModal(space)"> Edit </ion-item-option>
<ion-item-option color="danger" (click)="deleteSpace(space)" expandable> Delete </ion-item-option>
</ion-item-options>
</ion-item-sliding>
TS
deleteSpace(space: Space): void {
console.log('space.id',space)
this.setisDeleted(space);
}
setisDeleted(space): Promise<any> {
const isDeleted = true;
return this.angularFirestore
.collection('accounts')
.doc(this.userId)
.collection("spaces")
.doc(space.spaceId)
.update({ isDeleted })
}v