0

我使用 angular 6 和 openlayers 5.1.3。我npm install ol --save成功了,然后在我的角度我做到了

import OlMap from 'ol/map';
import OlXYZ from 'ol/source/xyz';
import OlTileLayer from 'ol/layer/tile';
import OlView from 'ol/View';
import * as OlProj from 'ol/proj';
import 'ol/ol.css';

export class myComponent {

 olmap: OlMap;
 source: OlXYZ;
 layer: OlTileLayer;
 view: OlView;
  //other, non-ol stuff
   loading: boolean = false;
   myname: String;

  ngOnInit() {

    this.source = new OlXYZ({
      url:'http://tile.stamen.com/terrain/{z}/{x}/{y}.jpg'
    });

    this.layer = new OlTileLayer({
      source: this.source
    });

    this.view = new OlView({
      center: OlProj.fromLonLat([6.661594, 50.433237]),
      zoom: 3,
    });

    const olmap = new OlMap({
      target: 'map',
      layers: [this.layer],
      view: this.view
    });


    navigator.geolocation.getCurrentPosition(function(pos) {
      const coords = OlProj.fromLonLat([pos.coords.longitude, pos.coords.latitude]);
      olmap.getView().animate({center: coords, zoom: 10});
    });

  }//ngOnInit

这工作正常,但问题是,如果我这样做

    this.olmap = new OlMap({
      target: 'map',
      layers: [this.layer],
      view: this.view
    });

进而

    navigator.geolocation.getCurrentPosition(function(pos) {
      const coords = OlProj.fromLonLat([pos.coords.longitude, pos.coords.latitude]);
      this.olmap.getView().animate({center: coords, zoom: 10});
    });

我得到Cannot read property 'olmap' of null 指的是这个this.olmap.getView().animate({center: coords, zoom: 10});

为什么我不能olmap用来引用this.olmap,因为我是在 Typescript 中与其他变量一起定义它的?我再也没有遇到过这个问题,我总是访问像this.x

为什么我会收到此错误?这是什么意思?

请解释一下,这样我就可以理解出了什么问题,并且可以继续我的项目,而不会有任何问题。

谢谢

4

1 回答 1

2

您看到的问题与 Javascript 词法范围有关。

在您的 Angular 6 项目中,您可以使用 ES6 箭头函数来访问父词法范围,您的代码现在应该按照您的预期运行:

navigator.geolocation.getCurrentPosition((pos) => {
  const coords = OlProj.fromLonLat([pos.coords.longitude, pos.coords.latitude]);
  this.olmap.getView().animate({center: coords, zoom: 10});
});

进一步阅读:

关于 ES2015 箭头函数和“this”你不知道的所有事情</a>
你不知道的 JS:作用域和闭包 - 附录 C:词法 this

于 2018-08-03T09:12:48.027 回答