如果您確定位置已定義並且您正在進入那裏,那是因爲this
已更改。 this
上下文可以根據它的調用方式而改變。如果您通過一個事件調用它,那麼this
將被限定在窗口或發起事件的元素。例如
export class GeoService {
public pos: any;
public getPosition() {
navigator.geoLocation.getCurrentPosition((position) => {
this.pos = position;
});
}
}
let geo = new GeoService();
// When called, `this` will be the window
setTimeout(geo.getPosition, 1000);
// When called, `this` will be the dom element
document.getElementById('myDiv').addEventListener('click', geo.getPosition);
您可以通過調用原始對象方法 -
// When called, `this` will be the window
setTimeout(() => { geo.getPosition(); }, 1000);
// When called, `this` will be the dom element
document.getElementById('myDiv').addEventListener('click',() => { geo.getPosition(); });
或者,通過使用lambda來確保它的設置爲getPosition作爲GeoService類的屬性匿名函數解決這個問題適當範圍。
export class GeoService {
public pos: any;
public getPosition =() => {
navigator.geoLocation.getCurrentPosition((position) => {
this.pos = position;
});
}
}
後者的注意事項。它可以使事情變得簡單並減少冗餘代碼,但請記住,每次構建GeoService類時都會創建一個新函數。這意味着每個實例都有一個這個函數的副本,而不是共享一個公共內存空間。換句話說,內存的成本更高。
希望這可以解決您的問題。
您確定這種情況發生了嗎?類型註釋在最終的javascript中不存在,因此它們不會對代碼的行爲產生任何影響。也許這是一個調試器的錯誤...如果你做console.log(this.pos);設置this.pos後它是否輸出undefined在第一種情況下仍然 –