Подтвердить что ты не робот

Предотвратите утечку памяти в Angular 2?

В Angular 2 есть ли какие-либо специфические проблемы в управлении памятью, я должен знать?

Каковы наилучшие методы управления состоянием компонентов во избежание возможных утечек?

В частности, я видел некоторых отказов от HTTP-наблюдаемых в методе ngOnDestroy. Должен ли я всегда это делать?

В Angular 1.X Я знаю, что когда a $scope уничтожается, все слушатели на нем также уничтожаются автоматически. Что относительно наблюдаемых в Angular 2 компонентах?

@Component({
  selector: 'library',
  template: `
    <tr *ngFor="#book of books | async">
        <td>{{ book.title.text }}</td>
        <td>{{ book.author.text }}</td>
    </tr>
  `
})
export class Library {
    books: Observable<any>;

    constructor(private backend: Backend) {
        this.books = this.backend.get('/texts'); // <-- does it get destroyed
                                                 //     with the component?
    }
};
4b9b3361

Ответ 1

Как запрошено @katspaugh

В вашем конкретном случае нет необходимости отменить подписку вручную, поскольку это задание на работу Async.

Проверьте исходный код для AsyncPipe. Для краткости я отправляю соответствующий код

class AsyncPipe implements PipeTransform, OnDestroy {
    // ...
    ngOnDestroy(): void {
        if (isPresent(this._subscription)) {
          this._dispose();
        }
    }

Как вы видите, Async-канал реализует OnDestroy, а когда он уничтожен, он проверяет, есть ли какая-то подписка и удаляет его.

Вы бы изобрели колесо в этом конкретном случае (извините за повторение себя). Это не означает, что вы не можете/не должны отписываться самостоятельно в любом другом случае, как тот, на который вы ссылались. В этом случае пользователь передает Observable между компонентами, чтобы сообщить их, поэтому хорошей практикой является отмена подписки вручную.

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

Надеюсь, это немного разъяснит о трубе Async.