Пожалуйста.

о общий вопрос относительно двух крючков жизненного циклаOnInit а такжеOnDestroy, Как этостатья упоминает, я всегда предполагал, чтоOnInit являетсявсегда бежать доOnDestroy.

У меня есть случай, когда вngOnDestroy() Я запрещаю воспроизведение фоновой музыки. Этот звук загружен компонентомngOnInit()и потому чтоngOnDestroy() выполняется безngOnInit() будучи запущенным звуковой объектundefined.

Код

ngOnInit() {
    ...

    this.loadSounds();

    ...
}

ngOnDestroy() {
    if (AppSettings.SOUNDS_ENABLED) {
        this.soundService.getSound(Sound.MINI_GAME_BG_MUSIC).fade(0.2, 0, 1500);
    }
}

private loadSounds() {
    this.soundService.loadSound(Sound.MINI_GAME_BG_MUSIC, SoundPathURL.MINI_GAME_BG_MUSIC, true, 0);
}

На данный момент код не работает вngOnDestroy при попытке.fade() звук этоundefined, Конечно, я могу легко это исправить, проверив, что звук неundefined перед выполнением.fade() функция. Мое предположение было, что еслиngOnDestroy() это запуститьngOnInit() Должно быть, тоже побежал - наверное, я ошибся.

Теперь из-за этого случая я думаю, что в каждомngOnDestroy() в моем приложении я должен проверить, является ли используемый объектundefined перед выполнением каких-либо операций. Так, например, прежде чем отписаться от подписки, я должен проверить, является ли подпискаundefined, и так далее.

Правильно ли я так предполагаю?

Ответы на вопрос(1)

Решение Вопроса

Ссылка четко говорится, чтоOnInit крюк жизненного цикла предшествуетOnDestroy, Это поведение характерно для компилятора в целом.Статья объясняет поведение, характерное для Angular router, и способ<router-outlet> Директива создает компоненты.router.navigateByUrl() в конструкторе компонента маршрутавызывает его немедленное уничтожение и предотвращает его компиляцию, поэтому жизненный цикл к нему не применим. Это не произойдет при нормальных обстоятельствах.

Код в вопросе не означает, чтоngOnInit не работаетngOnInit Вызов легко войти, чтобы доказать, что он работает.

Служба, используемая этим компонентом, может вызвать проблему. Дело в том, чтоНевозможно прочитать свойство 'исчезать' из неопределенного или аналогичная ошибкаngOnDestroy Значит этоthis.soundService.getSound(Sound.MINI_GAME_BG_MUSIC) не определено

Это полностью зависит от того, что происходит внутриsoundService оказание услуг. ЕслиloadSound является асинхронным, иngOnDestroy вызван до загрузки ресурса, могут быть проблемы.

 estus15 нояб. 2017 г., 16:35
Пожалуйста.
 Daniel Grima15 нояб. 2017 г., 16:28
Понял :) спасибо за объяснение
 estus13 нояб. 2017 г., 17:28
Единственная причина, по которой OnInit не запускается в статье, которую вы опубликовали, заключается в том, что правильная компиляция компонентов запрещена вconstructor потому что роутер был испорчен. Эта ситуация очень специфична для маршрутизатора Angular, а не для компилятора в целом. Маршрутизатор принудительно уничтожает класс компонента, не компилируя его. Это не произойдет при нормальных обстоятельствах. Я добавлю это к ответу для уточнения.
 Daniel Grima13 нояб. 2017 г., 16:50
Спасибо за ваш ответ. Я только нашел причину своей проблемы. Компонент создается динамически, и я только что понял, что из-за некоторого рефакторинга я забыл удалить старый код, и компонент создавался дважды. Я все еще заинтересован в том, чтобы узнать, может ли уничтожение когда-либо выполняться до перехватов жизненного цикла init. Как я уже упоминал, я предположил, что это работает так, хотя в статье, которую я связал, кажется, что это может произойти.

Ваш ответ на вопрос