2017-03-11 78 views
1

我有設置評論的問題, 這是angular 2項目的一部分。 該行this.reviews = targ給我
TypeError:無法設置未定義的屬性'評論'
該targ似乎存在,因爲我可以將它打印成控制檯成功。 任何想法爲什麼發生這種情況?Angular 2和typescript,不能設置undefined的屬性

import { ReviewService } from '../review.service'; 
import { Review } from '../review/review.component' 
import { Component} from '@angular/core'; 
import { OnInit } from '@angular/core'; 

@Component({ 
    selector: 'review-list', 
    templateUrl: './review-list.component.html', 
    styleUrls: ['./review-list.component.css'], 
    providers: [ReviewService] //for the injector to be able to inject ReviewerService 
}) 

export class ReviewListComponent implements OnInit { 
    public reviews: Review[]; 

    constructor(private reviewService: ReviewService) { 
    this.reviews = [] ; 
    } 


    initializeReviews(): void { 
    this.reviewService.getReviews().then(
     this.set  
    ).catch(function(reason){ 
     console.log(reason); 
    }); 

    } 



    set(targ):void { 
    console.log(targ); 
    this.reviews = targ; 

    } 

    ngOnInit(): void { 
    this.initializeReviews(); 
    //this.reviews = this.reviewService.get(); 
    } 

} 

回答

2

當方法引用傳遞,this不保留默認指向當前類的實例。使用.bind(this)或箭頭功能,以確保.this指向當前的類實例:

initializeReviews(): void { 
    this.reviewService.getReviews().then(
     this.set.bind(this) // << add `.bind(this) or 
     // (val) => this.set(val)  
    ).catch(function(reason){ 
     console.log(reason); 
    }); 

    } 
+0

加了.bind(這個)但沒有解決。 – Marcel

+0

沒有解決什麼問題? –

2

你正在失去this背景下,如果你通過method這樣的promise。您應該使用匿名函數包裝,或結合上下文this

initializeReviews(): void { 
    this.reviewService.getReviews().then((response) => { 
     this.set(response); 
    }) 
    .catch((reason) => { 
    console.log(reason); 
    }); 
} 

this.reviewService.getReviews().then(this.set.bind(this)) 

而且從不使用TypeScript類中的function關鍵字。這也會導致this上下文丟失。

+0

這解決了我的問題,謝謝! – Reozil

+0

對不起。我對綁定方法感到困惑。謝謝。 – Marcel

相關問題