Zdaję sobie sprawę, że kompilator TypeScript stara się zachować zgodność ze zwykłym starym JavaScriptem, ponieważ TypeScript jest rzeczywiście JavaScript. Istnieje jednak rozdźwięk między tym, co IntelliSense interpretuje jako słowo kluczowe "to", a tym, co faktycznie rozwiązuje w czasie wykonywania. Na przykład, należy rozważyć następujące wywołanie maszynopis ajax:
getAgencies() {
var self = this;
$.ajax(liveString + "/Home/GetSupportedAgencies",
{
type: "GET",
contentType: "application/json; charset=utf-8",
dataType: "json",
error: Utilities.Logger.displayAjaxError,
success: this.onGetAgenciesComplete
});
}
oraz jej odpowiedni callback:
onGetAgenciesComplete(agencies) {
var self = this;
if (agencies == null)
Utilities.Logger.displayErrorOnLogConsole("There was an error retrieving supported agencies. Refresh site and try again.");
else {
$.each(agencies, function (i, a) {
self._indexViewModel.agencies.push({ name: a.Name, fullName: a.FullName, shortName: a.ShortName, bbox: a.BBox, countryCode: a.CountryCode });
});
if (Modernizr.geolocation) {
navigator.geolocation.getCurrentPosition(
function (position) {
self.initMapPage(position, self);
},
function (error) {
Utilities.Logger.displayErrorOnLogConsole("Oops, we could not get your location at his time. Please try later.");
});
}
else {
Utilities.Logger.displayErrorOnLogConsole("Sorry, your browser does not return location information.");
self.getBusRoutes(self.agencyName);
}
// end of initialization
}
}
Teraz, kiedy najechaniu na linię „var siebie = to” w onGetAgenciesComplete w pliku źródłowym maszynopis, Definicja Intellisense zmiennej "self" wskazuje, że jest ona typu HomePageViewModelBase, gdzie HomePageViewModelBase jest klasą zawierającą powyższe metody.
Wygenerowany Javascript dla wyżej wymienionych jest następujący:
HomePageViewModelBase.prototype.getAgencies = function() {
var self = this;
$.ajax(liveString + "/Home/GetSupportedAgencies", {
type: "GET",
contentType: "application/json; charset=utf-8",
dataType: "json",
error: Utilities.Logger.displayAjaxError,
success: this.onGetAgenciesComplete
});
};
HomePageViewModelBase.prototype.onGetAgenciesComplete = function (agencies) {
var self = this;
if(agencies == null) {
Utilities.Logger.displayErrorOnLogConsole("There was an error retrieving supported agencies. Refresh site and try again.");
} else {
$.each(agencies, function (i, a) {
self._indexViewModel.agencies.push({
name: a.Name,
fullName: a.FullName,
shortName: a.ShortName,
bbox: a.BBox,
countryCode: a.CountryCode
});
});
if(Modernizr.geolocation) {
navigator.geolocation.getCurrentPosition(function (position) {
self.initMapPage(position, self);
}, function (error) {
Utilities.Logger.displayErrorOnLogConsole("Oops, we could not get your location at his time. Please try later.");
});
} else {
Utilities.Logger.displayErrorOnLogConsole("Sorry, your browser does not return location information.");
self.getBusRoutes(self.agencyName);
}
}
};
które po wykonaniu zmienną „ja” w HomePageViewModelBase.prototype.onGetAgenciesComplete uchwala się, co wygląda jak AjaxContext a nie instancję HomePageViewModelBase. Czy to oczekiwane zachowanie, czy powinienem zgłosić to jako błąd?
dobra odpowiedź - ustawienie kontekst działa. Zanim jednak zgłosisz błąd, rozważ to pytanie: W jaki sposób kompilator poprawnie wywnioskuje kontekst "tego", gdy funkcja może być wywołana w wielu różnych kontekstach. Uważam, że pokazuje właściwy kontekst oparty na założeniu, że funkcja jest wywoływana bezpośrednio, a nie w kontekście wywołania zwrotnego z innego źródła. – Fenton
Zgadzam się, a jeśli cokolwiek to jest dobra praktyka (jeśli cokolwiek oprócz czytelności), aby wyjaśnić, jaki powinien być kontekst "tego". Sądzę, że kluczem do sprawy było to, że nie powinien on wiedzieć, że jest to '$ .ajax', ponieważ tak to działa w jQuery? –
@mcpDESIGNS, to jest dobre wytłumaczenie, dziękuję. Nigdy nie wiedziałem o kontekście $ .ajax, który jest jeszcze lepszym rozwiązaniem. Podwójne dzięki.Jesteś także poprawny w punkcie mojego postu, który nie powinien być interpretowany przez intellisense "this" w $ .ajax na instancję bazy HomePageViewModel. –