html - 检测到 localStorage 角度 8 的变量变化
问题描述
我在组件调用导航栏上有这个功能:
getAddUsuario(){
if(window.localStorage.getItem('addUsuario') == 'false'){
window.localStorage.setItem('addUsuario','true');
}else{
window.localStorage.setItem('addUsuario','false');
}
return window.localStorage.getItem('addUsuario');
因此,当我单击变量 addUsuario 时,如果为 true,则更改为 false,如果为 false,则更改为 true。
问题是我想检测来自另一个组件的更改并将其传递给 HTML。如果为真,则采用一个 div 类,如果为假,则采用另一个 div 类。
我尝试使用 addEventlistener 但不起作用。
谢谢
解决方案
您可以将函数移动到单例服务并使用 observables 监控值。尝试以下
共享服务
import { BehaviorSubject, Observable } from 'rxjs'; // <-- included 'Observable' here - with capital 'O'
@Injectable()
export class SharedService {
private addUsuarioSource = new BehaviorSubject<string>('false');
public addUsuario$ = this.addUsuarioSource.asObservable();
constructor() {
this.addUsuario$.subscribe(status => window.localStorage.setItem('addUsuario', status)); // <-- changed 'userStatus' to 'status'
}
getAddUsuario(): Observable<string> { // <-- capital 'O' instead of small 'o'
let userStatus = window.localStorage.getItem('addUsuario');
userStatus = (userStatus === 'false' || userStatus == null) ? 'true' : 'false';
this.addUsuarioSource.next(userStatus);
return this.addUsuario$;
}
}
导航栏组件
import { pipe } from 'rxjs';
import { map, take } from 'rxjs/operators';
export class NavbarComponent implements OnInit() {
subscription: any;
ngOnInit() {
if (this.subscription) {
this.subscription.unsubscribe();
}
this.subscription = this.sharedService.getAddUsuario().pipe(take(1)).subscribe(status => {
// this callback will be called only once due to `pipe(take(1))`
// `status` variable with value 'true' or 'false' as string
});
}
}
另一个组件
this.sharedService.addUsuario$.subscribe(status => {
// this callback will be called each time a new user status is pushed
// `status` variable with value 'true' or 'false' as string
})
我BehaviorSubject
用来提供默认值。Subject
如果您不想提供默认值,可以使用 Rxjs 。pipe(take(1))
可以在这里找到解释。
注意:在本地存储中存储布尔值不是一个好主意。因为您只能存储字符串,并且它将值作为字符串返回。所以你不能做类似*ngIf==="status"
or 的事情*ngIf==="!status"
。这将是*ngIf="status === 'true'"
和*ngIf="status === 'false'"
。
工作示例:Stackblitz
推荐阅读
- javascript - 使用 AdonisJS 5 的文件存储 (S3)
- sicp - 是否有实现 call-with-current-continuation 的 SICP 元循环评估器
- r - 如何在 Shiny 中使用 updateSelectInput 更新复选框输入
- java - 在 Dremio 中通过 REST 调用添加数据源
- java - Spark java DataFrame Date过滤器基于max Date另一个DataFrame
- apache-kafka - Kafka 分区偏移量分布不均
- r - 在R中旋转轴文本标签
- javascript - 为什么即使我将其删除并保存,此代码仍会出现在我的代码中?
- javascript - 如何在 html5 日历中阻止日期
- ios - 将 cgrect 框架上的 y 值更改为屏幕顶部下方的 80