2017-02-09 55 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處理後臺線程上的網絡調用,但出於某種原因,這並沒有爲我點擊。 –