Angular 2和typescript,不能设置undefined的属性

时间:2017-03-11 16:38:59

标签: angular typescript

我在设置评论时遇到问题, 这是角度2项目的一部分。 this.reviews = targ这一行给了我 TypeError:无法设置undefined的属性'reviews' targ似乎存在,因为我可以成功地将它打印到控制台中。 任何想法为什么会发生这种情况?

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 个答案:

答案 0 :(得分: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);
     });

  }  

答案 1 :(得分: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))

function

也绝不使用TypeScript类中的this关键字。这也会导致setDT(mydf)上下文丢失。