我目前正在创建一个 Ionic 笔记应用程序,我将允许用户使用 reorderArray(( 函数重新排列列表中的项目。但是,我使用的是Firebase,因此在此.notesList上收到此错误。
类型为"可观察"的参数不可分配给 键入"任意[]"。属性"长度"在类型"可观察"中缺失。
我不确定如何将它与 Firebase 一起使用,所以任何事情都会有所帮助。这是我的代码:
.HTML:
<div *ngIf="editmode">
<ion-list reorder="true" (ionItemReoder)="reorderItem($event)">
<ion-item *ngFor="let note of notesList | async">
<ion-checkbox (ionChange)="addToTrash(note.id)"></ion-checkbox>
<ion-label>
<h1>{{ note.name }}</h1>
<span>{{ note.note_date | date: 'shortDate' }}</span>
<span>{{ note.text }}</span>
<span>{{ (notesList | async)?.length }}</span>
</ion-label>
</ion-item>
</ion-list>
</div>
打字稿:
export class NotesPage {
notesList: Observable<any>;
editmode: boolean = false;
trash = [];
constructor(
public navCtrl: NavController,
public navParams: NavParams,
public database: AngularFireDatabase,
public loadingCtrl: LoadingController,
public alertCtrl: AlertController
) {
this.loadNotes();
}
loadNotes() {
const loader = this.loadingCtrl.create();
loader.present().then( () => {
this.notesList = this.database.list('/notes').valueChanges();
loader.dismiss();
})
}
reorderItem( indexes ) {
this.notesList = reorderArray(this.notesList, indexes);
}
}
>this.notesList
在您的情况下是可观察的。 reorderItems
只能订购类似数组的。所以这样的事情应该可以解决问题。
notesList: any[];
[...]
loadNotes() {
const loader = this.loadingCtrl.create();
Observable.fromPromise(loader.present()).switchMap(() => { //1
return this.database.list('/notes').valueChanges(); //2
}).subscribe((list) => { //3
this.notesList = list; //4
loader.dismiss();
});
}
reorderItem( indexes ) {
this.notesList = reorderArray(this.notesList, indexes);
}
loader.present
"RXJS 方式"执行承诺- 切换到第二个可观察对象。
.valueChanges()
返回一个可观察量。 - 订阅第二个可观察对象以获取流值
- 将值写入 this.notesList 以触发 UI 绑定
编辑
<span>{{ (notesList | async)?.length }}</span>
必须是 <span>{{ notesList?.length }}</span>
因为notesList
不是异步的(不再是(。
(至少(有两种方法可以显示通过可观察管道流式传输的值。一个是模板中的异步管道,一个是我解释的方式。异步管道订阅引擎盖下的可观察量并返回值。但是使用管道,您无法那么轻松地重新订购项目。