Если angular уничтожает компонент / директиву с помощью ngOnDestroy()
, возможны утечки памяти из-за ситуации, когда observable
не был отписан.Таким образом, мы должны больше сосредоточиться на правильной подписке и отмене подписки , а не на сохранении наблюдаемых.Это намного лучшее решение.
Вы хотите, чтобы ваш observable
был как можно дольше, как я полагаю, поэтому самым простым способом было бы переместить вашу наблюдаемую с помощью subscribe()
к какому-то поставщику инъекций service
.Вы можете проверить некоторые документы об услугах здесь. К сожалению, он будет жить долго и процветать, пока вы не отмените подписку (не уничтожите ее) - риск утечки памяти все еще возможен.
То, что вы можете сделатьсделать, это правильно отписаться, когда вы закончили с использованием вашего наблюдаемого.Есть несколько возможных решений, но я рекомендую использовать async pipe
.Он перемещает проблему unsubscribe
в угловую и, как никто другой, знает, когда отписаться.Существуют и другие методы, такие как takeUntil()
, но вы можете самостоятельно провести некоторые исследования, например здесь .
Если вы действительно хотите сосредоточиться на значениях, а не на самих наблюдаемых - вы можете просто передать их изродители к ребенку и наоборот. Вот некоторые сведения о взаимодействиях компонентов .
TLDR;Не сохраняйте наблюдаемые - сосредоточьтесь на правильной подписке и отмене подписки на них при необходимости.
РЕДАКТИРОВАТЬ : я неправильно понял вопрос OP - поэтому я дам и пример, как сохранить наши значения от подписки(которые имеют наблюдаемый тип) в компоненте:
@Component({
selector: 'app-user-settings',
templateUrl: './user-settings.component.html'
})
export class UserSettingsComponent {
userSettings$: Observable<UserSettings>;
permissions$: Observable<UserSettingsPermissions>;
constructor(private store: Store<fromUserSettings.State>) {
this.UserSettings$ = store.select(fromUserSettings.getUserSettings);
this.permissions$ = store.select(fromUserSettings.getPermissions);
}
onSaveSettings(formGroup: FormGroup): void {
this.store.dispatch(new userSettings.PostUserSettings(formGroup));
}
}
Я назначаю свои наблюдаемые локальным переменным, которые доступны в пакете (чтобы использовать их в HTML).Так что да, если вам нужно использовать их вокруг вашего компонента, вы можете хранить их в некоторых переменных.Таким образом, наблюдаемые из хранилища должны быть доступны, пока компонент не уничтожен.Надеюсь, что это может украсить мой ответ.
PS.Я использую магазин ngrx, поэтому это может быть полезно.