无法在集合外访问 firebaseObjectObservable
Cannot access firebaseObjectObservable outside of set
首先,这是一个 Angular2 应用程序。我刚刚开始使用 Angular2 和 Firebase 进行构建。我也在使用 AngularFire2。我知道我的服务正在运行,因为我可以在订阅后立即打印出 blog.title
。但这是我唯一可以访问结果的地方。在其他任何地方都给我一个 undefined
错误。无论是在带有 {{}} 的模板中还是在 class 中使用它,我都会得到相同的结果。我不确定我做错了什么。我也是 observables 的新手。
export class BlogEditComponent implements OnInit {
blogForm: FormGroup;
blog$: FirebaseObjectObservable<Blog>;
blog: Blog;
constructor(private route: ActivatedRoute,
private router: Router,
private fb: FormBuilder,
private blogService: BlogService) { }
ngOnInit() {
this.isNew = false;
this.blog$ = this.blogService.getBlogFromId(this.route.snapshot.params['id']);
this.blog$.subscribe(snapshot =>{
this.blog = snapshot;
console.log(this.blog.title); //prints out fine
});
console.log(this.blog.title); //throws error here
}
}
博客服务
getBlogFromId(id: String): FirebaseObjectObservable<Blog> {
return this.af.database.object('blogs/' + id);
}
这是预期的行为:回调 运行 的时间与其周围的代码不同。
最容易看到这一点,您忽略实际值并只记录一些静态字符串:
ngOnInit() {
this.blog$ = this.blogService.getBlogFromId(this.route.snapshot.params['id']);
console.log("before subscribing");
this.blog$.subscribe(snapshot =>{
console.log("in callback");
});
console.log("after subscribing");
}
当你运行这个时,记录将是:
before subscribing
after subscribing
in callback
这可能不是您自然期望的顺序。但这是记录在案的行为:由于数据是从远程服务器加载的,因此可能需要一些时间才能回复您。在加载时,subscribe
调用后的代码继续。
我经常发现通过重新定义我的问题最容易解决这个问题。通常你会说“先获取博客 post,然后打印标题”。但现在将其重新定义为“开始获取博客 post;获取后,打印标题”。
在代码中,这意味着您将所有需要标题 的代码模式化为 回调,就像您的第一个日志记录语句一样。所以:
ngOnInit() {
this.isNew = false;
this.blog$ = this.blogService.getBlogFromId(this.route.snapshot.params['id']);
this.blog$.subscribe(snapshot =>{
this.blog = snapshot;
console.log(this.blog.title);
});
}
这还有一个好处,即如果博客标题发生变化,将打印博客标题,这是 Firebase 实时数据库的主要功能之一。
首先,这是一个 Angular2 应用程序。我刚刚开始使用 Angular2 和 Firebase 进行构建。我也在使用 AngularFire2。我知道我的服务正在运行,因为我可以在订阅后立即打印出 blog.title
。但这是我唯一可以访问结果的地方。在其他任何地方都给我一个 undefined
错误。无论是在带有 {{}} 的模板中还是在 class 中使用它,我都会得到相同的结果。我不确定我做错了什么。我也是 observables 的新手。
export class BlogEditComponent implements OnInit {
blogForm: FormGroup;
blog$: FirebaseObjectObservable<Blog>;
blog: Blog;
constructor(private route: ActivatedRoute,
private router: Router,
private fb: FormBuilder,
private blogService: BlogService) { }
ngOnInit() {
this.isNew = false;
this.blog$ = this.blogService.getBlogFromId(this.route.snapshot.params['id']);
this.blog$.subscribe(snapshot =>{
this.blog = snapshot;
console.log(this.blog.title); //prints out fine
});
console.log(this.blog.title); //throws error here
}
}
博客服务
getBlogFromId(id: String): FirebaseObjectObservable<Blog> {
return this.af.database.object('blogs/' + id);
}
这是预期的行为:回调 运行 的时间与其周围的代码不同。
最容易看到这一点,您忽略实际值并只记录一些静态字符串:
ngOnInit() {
this.blog$ = this.blogService.getBlogFromId(this.route.snapshot.params['id']);
console.log("before subscribing");
this.blog$.subscribe(snapshot =>{
console.log("in callback");
});
console.log("after subscribing");
}
当你运行这个时,记录将是:
before subscribing
after subscribing
in callback
这可能不是您自然期望的顺序。但这是记录在案的行为:由于数据是从远程服务器加载的,因此可能需要一些时间才能回复您。在加载时,subscribe
调用后的代码继续。
我经常发现通过重新定义我的问题最容易解决这个问题。通常你会说“先获取博客 post,然后打印标题”。但现在将其重新定义为“开始获取博客 post;获取后,打印标题”。
在代码中,这意味着您将所有需要标题 的代码模式化为 回调,就像您的第一个日志记录语句一样。所以:
ngOnInit() {
this.isNew = false;
this.blog$ = this.blogService.getBlogFromId(this.route.snapshot.params['id']);
this.blog$.subscribe(snapshot =>{
this.blog = snapshot;
console.log(this.blog.title);
});
}
这还有一个好处,即如果博客标题发生变化,将打印博客标题,这是 Firebase 实时数据库的主要功能之一。