Сегодня я работал над переносом существующего базового кода Angular js ngRoute на ngNewRouter и застрял в контроллере компонентов. Согласно новому контроллеру компонента apporach не существует $ scope, вместо него используется "this". Он отлично работает для простого использования. В моем случае для конкретного компонента я делаю вызов REST API для получения данных. Все работает, но когда происходит обратный вызов, он не идентифицирует "этот" определенный объект. Ниже приведен фрагмент кода для более подробной информации.
Компонентный контроллер для выполнения вызова для получения данных:
var ClubonboardingController = function ($location, ApplicationLoaderService, ApplicationConstants, $window, ResourceImplementation, $rootScope) {
//Launch Application
this.launchApplication = function () {
this.cacheLoaded = true;
};
//Method to initialize
this.init = function () {
//show loading screen
this.showLoadingScreen = true;
//Initilize Application cache
ApplicationLoaderService.initilizeApplicationCache($rootScope, "3252345", true, "en_US", function () {
this.launchApplication(); //This throws function not found exception
});
};
//Call init() to initialze the loading.
this.init();
};
app.controller("ClubonboardingController", ClubonboardingController);
ClubonboardingController.$inject = ['$location', 'ApplicationLoaderService', 'ApplicationConstants', '$window', 'ResourceImplementation', '$rootScope'];
Проблема: после того, как код обратного вызова считает "это" глобальным объектом javascript, вместо этого "this" для этого контроллера и не сможет найти что-либо в этом контроллере, и он генерирует исключение в this.launchApplication(); ,
Пожалуйста помоги.
Я думаю, проблема заключается в том, что "это" означает изменения в зависимости от контекста. Кажется, существует общая рекомендация присвоить "это" локальной переменной и использовать переменную. Благодаря закрытию JavaScript значение "this" сохраняется.
Использование локальной переменной vm, как представляется, является обычным явлением и заменяет все это. с 'vm.' Ваш код в конечном итоге изменится на
var ClubonboardingController = function ($location, ApplicationLoaderService, ApplicationConstants,
$window, ResourceImplementation, $rootScope) {
var vm = this;
//Launch Application
vm.launchApplication = function () {
vm.cacheLoaded = true;
};
//Method to initialize
vm.init = function () {
...
Надеюсь это поможет.