我正在尝试更新Firebase数据,并且遇到错误“预订”类型上不存在“属性'更新'的错误。我可以控制台记录该对象,而它确实是我想要的对象。我只是不确定如何使用可观察对象上的“订阅”方法更新对象。
import { Injectable } from '@angular/core';
import { Post } from './models/post.model';
import { AngularFireDatabase, FirebaseListObservable } from 'angularfire2/database';
@Injectable()
export class PostService {
posts: FirebaseListObservable<any[]>;
constructor(private database: AngularFireDatabase) {
this.posts = database.list('posts');
}
getPosts(){
return this.posts;
}
getPostById(postId: string){
return this.database.object('posts/' + postId)
}
updatePost(localPost){
var postInFirebase = this.getPostById(localPost.$key).subscribe(dataLastEmittedFromObserver => {
postInFirebase = dataLastEmittedFromObserver
console.log(postInFirebase)
postInFirebase.update({content: localPost.content});
});
};
deletePost(localPostToDelete){
let postInFireBase = this.getPostById(localPostToDelete.$key);
postInFireBase.remove();
}
addPost(newPost: Post){
this.posts.push(newPost)
}
}
答案 0 :(得分:1)
请尝试从订阅行中删除var postInFirebase =
,因为Observer.subscribe
在调用异步回调之前会同步返回一个Subscription
对象。这可能会导致TypeScript编译器将类型Subscription
分配给变量postInFirebase
并引发编译错误。
updatePost(localPost){
this.getPostById(localPost.$key).subscribe(dataLastEmittedFromObserver => {
let postInFirebase = dataLastEmittedFromObserver
console.log(postInFirebase)
postInFirebase.update({content: localPost.content});
});
}
甚至更好
updatePost(localPost){
this.getPostById(localPost.$key).subscribe(postInFirebase => {
postInFirebase.update({content: localPost.content});
});
}
您似乎对Observables的异步签名感到困惑。当您调用var value = Observable.subscribe((data) => { ...});
时,value
将是一个订阅,而不是观察到的数据,您只能在异步回调内部访问可观察的数据。这使我认为您的deletePost
方法也不起作用。