Uncaught TypeError: Cannot read property 'push' of undefined while pushing data in public array

Uncaught TypeError: Cannot read property 'push' of undefined while pushing data in public array

我正在尝试在函数调用时将一些值推送到数组中。我在函数中得到了 vaues,但是当我试图将这些值推送到数组中时,我收到错误 Cannot read 属性 'push' of undefined。但是,我已根据打字稿格式将数组初始化为 public 。但是,我无法找到我做错的地方。我是 angular 的新手,所以请原谅愚蠢的错误。

    export class AppHome
    {
      public pick_markers:Array<object> = [];
      public dest_markers:Array<object> = [];   

      constructor(private mapsAPILoader: MapsAPILoader, private ngZone: NgZone) {}

      ngOnInit() {
        this.codeAddress('Av. da Liberdade, 1250-096 Lisboa, Portugal','pickup');
      }

      codeAddress(address: string,type) {
        console.log(address);
        var geocoder = new google.maps.Geocoder();
        let latlng:any;
        geocoder.geocode({ 'address': address }, function (results, status) {
          console.log(status);
          if (status == google.maps.GeocoderStatus.OK) {
            let get_lat = results[0].geometry.location.lat();
            let get_lng = results[0].geometry.location.lng();
            if(type=='dest') {
              this.dest_markers.push({lat:+get_lat,lng:+get_lng});
              console.log(this.dest_markers);                       
            } else if(type='pickup') {
              this.pick_markers.push({lat:+get_lat,lng:+get_lng});
              console.log('pickuplatlng--lat::'+this.lat+',,,lng::'+this.lng);
            } else {
              console.log('no input');
            }
          } else {
            alert("Request failed.")
          }
        });
      }
    }

此错误是由于数组初始化错误造成的。

这样初始化数组,就可以了

 dest_markers :Array<any>=[];
 pick_markers :Array<any>=[];

您指向错误 this,使用箭头函数或存储上下文,如下例所示:

    export class AppHome
    {
      public pick_markers:Array<object> = [];
      public dest_markers:Array<object> = [];   

      constructor(private mapsAPILoader: MapsAPILoader, private ngZone: NgZone) {}

      ngOnInit() {
        this.codeAddress('Av. da Liberdade, 1250-096 Lisboa, Portugal','pickup');
      }

      codeAddress(address: string,type) {
        console.log(address);
        var geocoder = new google.maps.Geocoder();
        let latlng:any;
        geocoder.geocode({ 'address': address }, (results, status) => {
          console.log(status);
          if (status == google.maps.GeocoderStatus.OK) {
            let get_lat = results[0].geometry.location.lat();
            let get_lng = results[0].geometry.location.lng();
            if(type=='dest') {
              this.dest_markers.push({lat:+get_lat,lng:+get_lng});
              console.log(this.dest_markers);                       
            } else if(type='pickup') {
              this.pick_markers.push({lat:+get_lat,lng:+get_lng});
              console.log('pickuplatlng--lat::'+this.lat+',,,lng::'+this.lng);
            } else {
              console.log('no input');
            }
          } else {
            alert("Request failed.")
          }
        });
      }
    }

或:

    export class AppHome
    {
      public pick_markers:Array<object> = [];
      public dest_markers:Array<object> = [];   

      constructor(private mapsAPILoader: MapsAPILoader, private ngZone: NgZone) {}

      ngOnInit() {
        this.codeAddress('Av. da Liberdade, 1250-096 Lisboa, Portugal','pickup');
      }

      codeAddress(address: string,type) {
        console.log(address);
        var geocoder = new google.maps.Geocoder();
        let latlng:any;
        const self = this; // <= store context
        geocoder.geocode({ 'address': address }, function (results, status) {
          console.log(status);
          if (status == google.maps.GeocoderStatus.OK) {
            let get_lat = results[0].geometry.location.lat();
            let get_lng = results[0].geometry.location.lng();
            if(type=='dest') {
              self.dest_markers.push({lat:+get_lat,lng:+get_lng});
              console.log(this.dest_markers);                       
            } else if(type='pickup') {
              self.pick_markers.push({lat:+get_lat,lng:+get_lng});
              console.log('pickuplatlng--lat::'+this.lat+',,,lng::'+this.lng);
            } else {
              console.log('no input');
            }
          } else {
            alert("Request failed.")
          }
        });
      }
    }

为了更好,您可以定义一个接口来声明对象的形状,如下所示:

interface Coords {
  lat: number;
  lng: number
}

public pick_markers:Array<Coords> = [];
public dest_markers:Array<Coords> = [];

有关更多解决方案,请阅读此主题:

我认为问题出在数组声明上。

尝试,

pick_markers: any[];
dest_markers: any[];

this.pick_markers.push('data');
this.dest_markers.push('data');