[英]How to share data between components in angular
我使用 observable 将值从一个组件发送到另一个组件(数据在单击另一个组件后发送给订阅者,即通过主题)我订阅另一个组件并且一切正常,直到我刷新页面,刷新页面后组件被重新创建,重新创建后订阅者没有数据,因为他没有通过第一个组件 go。我该如何解决这个问题?
我尝试使用 rxjs 运算符作为 shareReplay 但它不像 shareReplay 那样工作
发生这种情况是因为一切都在 memory 中,并且由于 angular 应用程序正在重新初始化,页面刷新时所有内容都丢失了。 您需要保留 state,例如将其写入本地存储,为此您可以使用 rxjs 中的“tap”运算符。并且在加载时您可以从 localstorage end emit-it 读取数据,为此您可以使用 app_initializer 挂钩。
由于您的 Angular 应用程序在刷新页面时被销毁并重建,不幸的是您将丢失所有未保存在某处的用户 state。 这是构建 UI 时的常见问题,因此有许多工具可以解决这个问题
策略:
选项:
这些方法都没有内置到 RxJS 运算符中(据我所知),但我们可以轻松地利用 RxJS 来轻松实现上述任何策略。 tap
运算符通常专门用于处理副作用,即应该作为 RxJS 发射的巧合发生的操作。 这正是我们在这里想要的,简单来说:
请参阅下面的示例实现
tab.service.ts
type TabType = 'first' | 'second'
@Injectable({
providedIn: 'root'
})
export class TabService {
tabSelectedSubject: BehaviorSubject<TabType> = new BehaviorSubject<TabType>('first')
tabSelected$: Observable<TabType> =
this.tabSelectedSubject
.pipe(
tap(tab: TabType) => {
// ... your persist code here
this.saveTab()
},
distinctUntilChanged()
)
constructor() {
// ... your hydrate code here
this.fetchAndApplyTab();
}
saveTab(): void {
localStorage.setItem('tab', tab)
}
fetchAndApplyTab(): void {
const savedTab: TabType | null = localStorage.getItem('tab');
if (savedTab) {
this.tabSelectedSubject.next(savedTab)
}
}
}
在这种情况下,我们正在利用我们的服务是这样的事实:
这允许我们将我们的fetchAndApplyTab()
逻辑放在tab.service.ts
的构造函数中并保持代码独立。 但是,根据您的用例,您可能希望自己从组件手动运行fetchAndApplyTab()
。
大多数情况下有 2 天时间在组件之间传递数据
在 SPA 应用程序中,如果您刷新浏览器,那么 memory 中的所有对象和可观察对象都不存在,您需要再次 go 返回到它将被初始化的屏幕。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.