поле машинописи является нулевым при передаче частного метода в лямбду - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть следующий класс; я сделал это как можно короче, чтобы объяснить проблему:

@Injectable()
export class TestService {
...

  private testSubscription: Subscription = new Subscription;

  constructor(
    private store: Store<FromTest.IState>,
    private otherService: otherService) {
  }

  public MainTestMethod() {
       this.testSubscription = this.otherService.getSomethingObservable().subscribe(toBeCalledTestMethod)
  }

  private toBeCalledTestMethod(something: boolean) {
       this.store <- undefined
  }
...
}

При передаче метода для подписки поле «store» не определено. Однако, когда я изменяю метод подписки на:

   this.testSubscription = this.otherService.getSomethingObservable().subscribe(x => toBeCalledTestMethod(x))

, поле "store" имеет значение (что ожидается).

Рад, что нашел способ заставить его работать, но я не Я не понимаю, почему передача метода в виде лямбды может привести к другому поведению.

Я новичок в машинописи и angular, поэтому хотел бы узнать почему.

Заранее спасибо!

1 Ответ

0 голосов
/ 17 апреля 2020

Спасибо @ritaj за комментарий "toBeCalledTestMethod.bind (this)", теперь я знаю почему.

Передача метода следующим образом:

this.otherService.getSomethingObservable (). Subscribe (toBeCalledTestMethod)

Передает метод без контекста в функцию подписки.

Чтобы сохранить контекст с помощью метода, вы либо привязываете его к классу с помощью bind, либо используете лямбду для сохранения своего контекста.

При прохождении лямбды будет передаваться функция, которая будет выполнять метод в своем контексте.

...