2

Разрабатываю компонент, отвечающий за авторизацию в Angular2-приложении. Код компонента:

import { Component, OnInit } from '@angular/core';
import { IAuthData } from './auth-data';
import { IAuthResult } from './auth-result';
import { AuthorizationService } from './authorization.service';
import { NotificationsService } from 'angular2-notifications';

@Component({
    templateUrl: 'authorization.component.html',
    styleUrls: [ 'authorization.component.css' ],
    moduleId: module.id
})
export class AuthorizationComponent implements OnInit {
    private _authorizationService: AuthorizationService;
    private _notificationsService: NotificationsService;

    constructor(private authorizationService: AuthorizationService, private notificationsService: NotificationsService) {
        this._authorizationService = authorizationService;
        this._notificationsService = notificationsService;
    }

    public pageTitle: string = 'Авторизация';
    public login: string;
    public password: string;

    ngOnInit() : void {

    }

    authorize(): void {
        this._notificationsService.info(this.pageTitle, `Попытка авторизации пользователя "${this.login}": запрос отправлен на сервер.`);
        this._authorizationService.authorize(<IAuthData>{ login: this.login, hash: this.password })
            .subscribe(authResult => {
                let message: string = `"${this.login}": ${authResult.message}`;
                if (authResult.isAuthorized) {
                    this._notificationsService.info(this.pageTitle, message);
                }
                else {
                    this._notificationsService.error(this.pageTitle, message);
                }
            });
    }
}

Данный вариант работает, однако при рефакторинге решил вынести лямбду, которая передаётся в метод subscribe в отдельный метод:

private processAuthResult(authResult: IAuthData): void {
     let message: string = `"${this.login}": ${authResult.message}`;
                    if (authResult.isAuthorized) {
                        this._notificationsService.info(this.pageTitle, message);
                    }
                    else {
                        this._notificationsService.error(this.pageTitle, message);
                    }let message: string = `"${this.login}": ${authResult.message}`;
                    if (authResult.isAuthorized) {
                        this._notificationsService.info(this.pageTitle, message);
                    }
                    else {
                        this._notificationsService.error(this.pageTitle, message);
                    }
}

authorize(): void {
            this._notificationsService.info(this.pageTitle, `Попытка авторизации пользователя "${this.login}": запрос отправлен на сервер.`);
            this._authorizationService.authorize(<IAuthData>{ login: this.login, hash: this.password })
                .subscribe(this.processAuthResult);
        }

Если организовать код подобным образом, поле this._notificationsService имеет значение undefined. В чём может быть причина?

Bald
  • 6,509
klutch1991
  • 2,733

1 Answers1

2

Тут дело не в модификаторе доступа, а в смене контекста this. Вам необходимо сохранить контекст :

authorize(): void {
    this._notificationsService.info(this.pageTitle, `Попытка авторизации пользователя "${this.login}": запрос отправлен на сервер.`);
    this._authorizationService.authorize(<IAuthData>{ login: this.login, hash: this.password })
        .subscribe(authResult => this.processAuthResult(authResult));
    }
}
Zugr
  • 448