Учитывая этот кусок кода:Почему «this» ссылается на «окно» в этом фрагменте кода?
module movieApp {
export interface IHomeControllerScope extends ng.IScope {
moviesToDownload: string[];
active: string;
deleteMovieFromDownloadList(movie: any);
markMovieAsDownloaded(movie: any);
}
export class HomeController {
public static $inject = [
'$scope',
'$location',
'MovieService'
];
constructor(private $scope: IHomeControllerScope, private $location: ng.ILocationService, private MovieService) {
this.$scope.$on('$locationChangeSuccess', (event) => {
this.setActiveUrlPart();
});
MovieService.getMoviesToDownload().then(response => {
this.$scope.moviesToDownload = response;
});
}
private setActiveUrlPart() {
var parts = this.$location.path().split('/');
this.$scope.active = parts[1];
}
public get moviesToDownload() {
return this.$scope.moviesToDownload;
}
public markMovieAsDownloaded(movie: any) {
movie.Downloaded = true;
}
public deleteMovieFromDownloadList(movie: any) {
this.MovieService.deleteMovieFromDownloadList(movie).then(() => {
debugger;
this.$scope.moviesToDownload = _.without(this.$scope.moviesToDownload, movie);
});
}
}
}
app.controller("HomeController", movieApp.HomeController);
Все работает просто отлично, но в методе deleteMovieFromDownloadList
в линии this.$scope.moviesToDownload = _.without(this.$scope.moviesToDownload, movie);
, this
ссылается на объект окна, вместо реального объекта я ожидаю.
Сформированный JavaScript выглядит следующим образом:
var movieApp;
(function (movieApp) {
var HomeController = (function() {
function HomeController($scope, $location, MovieService) {
var _this = this;
this.$scope = $scope;
this.$location = $location;
this.MovieService = MovieService;
this.$scope.$on('$locationChangeSuccess', function (event) {
_this.setActiveUrlPart();
});
MovieService.getMoviesToDownload().then(function (response) {
_this.$scope.moviesToDownload = response;
});
}
HomeController.prototype.setActiveUrlPart = function() {
var parts = this.$location.path().split('/');
this.$scope.active = parts[1];
};
Object.defineProperty(HomeController.prototype, "moviesToDownload", {
get: function() {
return this.$scope.moviesToDownload;
},
enumerable: true,
configurable: true
});
HomeController.prototype.markMovieAsDownloaded = function (movie) {
movie.Downloaded = true;
};
HomeController.prototype.deleteMovieFromDownloadList = function (movie) {
var _this = this;
this.MovieService.deleteMovieFromDownloadList(movie).then(function() {
debugger;
_this.$scope.moviesToDownload = _.without(_this.$scope.moviesToDownload, movie);
});
};
HomeController.$inject = [
'$scope',
'$location',
'MovieService'
];
return HomeController;
})();
movieApp.HomeController = HomeController;
})(movieApp || (movieApp = {}));
app.controller("HomeController", movieApp.HomeController);
//# sourceMappingURL=HomeController.js.map
Как вы можете видеть, в сгенерированном JS, конкретный метод использует _this. Это выглядит правильно, не так ли?
Может ли кто-нибудь объяснить мне, что происходит и как это исправить?
EDIT:
Я использую это в сочетании с угловыми:
<body data-ng-app="movieApp" data-ng-controller="HomeController as homeCtrl">
<div class="col-sm-1">
<i class="fa fa-trash-o" data-ng-click="homeCtrl.deleteMovieFromDownloadList(m)" title="Verwijder uit lijst"></i>
</div>
</body>
EDIT II: После попытки все предложения и затем установить обратно оригинальный кусок кода, который я разместил здесь, все просто отлично работает! Я не знаю, как, но я думаю, что это имеет какое-то отношение к Chrome/VS 2013. В любом случае, благодаря тем, кто пытался мне помочь.
Возможно, функция «deleteMovie ...» привязана к кнопке или другому элементу пользовательского интерфейса. В этом случае эта функция выполняется в контексте окна. Чтобы устранить проблему, вы должны определить тело функции в конструкторе вашего контроллера: this.deleteMovieFromDownloadList = (movie: any) => { this.MovieService.deleteMovieFromDownloadList (movie) .then (() => { debugger; это. $ Scope.moviesToDownload = _.without (это. $ Scope.moviesToDownload, movie); }); } – TSV
Я всегда перемещаю такие функции в конструкторе. Я уверен, что это самый простой способ исправить проблему с помощью «этого» в контроллерах TypeScript. – TSV