2017-02-09 77 views
1

首先,这是一个Angular2应用程序。我刚刚开始使用Angular2和Firebase进行构建。我也使用AngularFire2。我知道我的服务正在工作,因为我可以在订阅后打印出blog.title就好了。但那是我可以访问结果的唯一地方。在其他地方,它给我一个undefined错误。无论是在{{}}模板还是在类中使用它,我都会得到相同的结果。我不确定我做错了什么。我也是新的观察对象。无法访问设置外的firebaseObjectObservable

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 
    } 

} 

BlogService

getBlogFromId(id: String): FirebaseObjectObservable<Blog> { 
    return this.af.database.object('blogs/' + id); 
} 

回答

2

这是预期的行为:回调在不同的时间比它周围的代码运行。

这是最容易看到这一点,你忽略了实际值,只是记录一些静态的字符串:

订阅

前:

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"); 
} 

当你运行它,记录会

订阅后

回调

这可能不是您自然预期的顺序。但这是记录的行为:由于数据是从远程服务器加载的,因此可能需要一些时间才能找到您。当它被加载时,subscribe调用之后的代码继续。

我经常发现通过重新组合我的问题是最容易的。通常你会说“首先得到博客文章,然后打印标题”。但是现在将其重新设置为“开始获取博客帖子;当你收到它时,打印标题”。

在代码中,这意味着您需要将所有需要标题的代码模式化为回调,就像您的第一个日志记录语句。所以:

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); 
    }); 
} 

这也具有的优点是博客标题将打印,如果博客标题的变化,这是火力地堡实时数据库的主要材料之一。

+0

谢谢。我应该更清楚地知道。我一直使用Android处理后台线程上的网络调用,但出于某种原因,这并没有为我点击。 –