我可以想到像在localStorage
对象上创建一个服务包装器并使用它EventManager
来跟踪其他选项卡上的 localStorage 更改的解决方案
本地存储服务
@Injectable({
providedIn: "root"
})
export class LocalStorageService {
private change = new EventEmitter();
constructor(private eventManager: EventManager) {
this.eventManager.addGlobalEventListener(
"window",
"storage",
({ key, oldValue, newValue }) => {
if (key) { // this mean new item has been set
this.change.emit({
type: localStorageAction.set,
key,
oldValue,
newValue
});
} else { // if key is null this mean the localstorage is cleared
this.change.emit({
type: localStorageAction.clear
});
}
}
);
}
subscribe(handler) {
return this.change.subscribe(handler);
}
clear() {
localStorage.clear();
this.change.emit({
type: localStorageAction.clear
});
}
getItem(key: string) {
return localStorage.getItem(key);
}
key(index: number) {
return localStorage.key(index);
}
get length() {
return localStorage.length;
}
removeItem(key: string) {
localStorage.removeItem(key);
this.change.emit({
type: localStorageAction.remove,
key
});
}
setItem(key: string, value) {
const oldValue = localStorage.getItem("key");
localStorage.setItem(key, value);
this.change.emit({
type: localStorageAction.set,
key,
oldValue,
newValue: value
});
}
}
现在通过这项服务,您可以跟踪设置、删除项目、清除等更改
演示
- 在演示 stackblitz 中,不断更改 localStorage,说明您收到更改通知的原因。
- 您需要使用此服务而不是
localStorage
对象,以便您可以在同一窗口中获得更改通知。
- subscribe 方法返回一个订阅对象。