Я использую карты Bing v8 для геокодирования. сначала этого кода не было в классе. В итоге я добавил код в класс из-за этой ошибки:
typescript cannot redeclare block-scoped variable 'map'
Поскольку сейчас я использую класс, у меня проблемы с «этим». Прочитав об 'этом' в TypeScript, я я изменил свои функции, используя функции экземпляра (функции стрелки экземпляра):
/// <reference path="./../scripts/MicrosoftMaps/Microsoft.Maps.d.ts" />
/// <reference path="./../scripts/MicrosoftMaps/Modules/Search.d.ts" />
/// <reference path="./../scripts/typings/jquery/jquery.d.ts" />
class BMGeocode {
map: Microsoft.Maps.Map;
searchManager: Microsoft.Maps.Search.SearchManager;
public loadMap = () => {
this.map = new Microsoft.Maps.Map('#map', {
credentials: 'xxx',
center: new Microsoft.Maps.Location(51.087299, 2.976770),
zoom: 10
});
}
public search = () => {
if (!this.searchManager) {
Microsoft.Maps.loadModule('Microsoft.Maps.Search', function () {
this.searchManager = new Microsoft.Maps.Search.SearchManager(this.map) ; // PROBLEM: searchManager is never set?
});
}
// remove any previous results from the map.
this.map.entities.clear();
// get the users query and geocode it.
let query: string = (<HTMLInputElement>document.getElementById("txtInput")).value;
this.geocodeQuery(query);
}
private geocodeQuery = (query: string) => {
var userData = { name: 'Maps Test User', id: 'XYZ' };
let searchRequest: Microsoft.Maps.Search.IGeocodeRequestOptions = {
where: query,
userData: userData,
count: 5,
bounds: this.map.getBounds(),
callback: function (r: any) {
// PROBLEM: r undefined.
if (r && r.results && r.results.length > 0) {
var topResult = r.results[0];
if (topResult) {
this.addPin(topResult.location);
$('#txtInput').focus().select();
}
}
},
errorCallback: function (e: any) {
// If there is an error, alert the user about it.
alert("No results found.");
}
};
// make the geocode request:
this.searchManager.geocode(searchRequest);
}
// .. other stuff in class
}
let geo: BMGeocode = new BMGeocode();
function onGeocodeClick() {
geo.search();
}
$(function() {
geo.loadMap();
$('#geocode').click(onGeocodeClick);
})
Я думаю, что обнаружил проблему, почему она не работает, так как searchManager всегда имеет значение null или undefined. Однако я не знаю, как это решить.
Эта строка из функции «поиск» работает, но, похоже, не устанавливает переменную searchManager:
this.searchManager = new Microsoft.Maps.Search.SearchManager(this.map);
searchManager не установлен, поэтому я не могу сделать запрос:
// make the geocode request:
this.searchManager.geocode(searchRequest);
Как это можно решить в TypeScript?
Обновление: это тоже не работает:
public search = () => {
if (!this.searchManager) {
var self = this;
Microsoft.Maps.loadModule('Microsoft.Maps.Search', function () {
self.searchManager = new Microsoft.Maps.Search.SearchManager(self.map); // PROBLEM!!
self.search();
});
} else {
// remove any previous results from the map.
this.map.entities.clear();
// get the users query and geocode it.
let query: string = (<HTMLInputElement>document.getElementById("txtInput")).value;
this.geocodeQuery(query);
}
this.searchManager = new Microsoft.Maps.Search.SearchManager(this.map) ;
- person Tamas Hegedus   schedule 23.11.2016noImplicitThis
, который поможет отметить места, где вы можете потерять ссылку наthis
. - person Daniel Rosenwasser   schedule 23.11.2016