javascript - Angular 购物车 - 本地存储服务及订阅变化
我在通过我的购物车服务使用本地存储来监控购物车变化的问题上遇到了很多麻烦。我如何订阅诸如增加数量或删除商品等更改,以便页面在事件发生时显示新的数据?
有没有办法持续监控 localStorage,并在我的其他方法对 localStorage 进行更改时更新我的 getItems()?
我整整一天下来一直在做这个,脑子有点迟钝,有任何帮助都太棒了!
CartComponent.ts ---
import { Component, OnInit } from '@angular/core';
import { CartService } from '../services/cart.service';
import { Products } from '../models/products';
import { Item } from '../models/item';
@Component({
selector: 'app-cart',
templateUrl: './cart.component.html',
styleUrls: ['./cart.component.css']
})
export class CartComponent implements OnInit {
product: Products;
public items: Item = new Item();
item;
constructor(private cartService: CartService) { }
ngOnInit(): void {
this.items = this.cartService.getItems();
//this.items = this.cartService.getItems();
}
deleteItem(item){
this.cartService.deleteItem(item);
let domItem = document.getElementById(`cart-item`+item.product.id);
setTimeout(() =>{
domItem.classList.add('delete-style');
domItem.parentNode.removeChild(domItem);
},1000);
}
addQty(item){
this.cartService.addQty(item);
}
}
CartService.ts ---
import { Injectable } from '@angular/core';
import { Products } from '../models/products';
import { Item } from '../models/item';
import { Observable, of } from 'rxjs';
import { StorageService } from '../services/storage.service';
let itemsInCart = [];
let cart = [];
//console.log("itemsInCart: ", itemsInCart);
@Injectable({
providedIn: 'root'
})
export class CartService {
product: Products;
items: Item;
constructor() { }
addToCart(product: Products) {
let local_storage;
let itemsInCart = []
this.items = {
product: product,
quantity: 1,
}
if(localStorage.getItem('cart') == null){
local_storage =[];
console.log("LOCALSTORAGE NULL",JSON.parse(localStorage.getItem('cart')));
itemsInCart.push(this.items);
localStorage.setItem('cart', JSON.stringify(itemsInCart));
console.log('Pushed first Item: ', itemsInCart);
}
else
{
local_storage = JSON.parse(localStorage.getItem('cart'));
console.log("LOCAL STORAGE HAS ITEMS",JSON.parse(localStorage.getItem('cart')));
for(var i in local_storage)
{
console.log(local_storage[i].product.id);
if(this.items.product.id == local_storage[i].product.id)
{
local_storage[i].quantity += 1;
console.log("Quantity for "+i+" : "+ local_storage[i].quantity);
console.log('same product! index is ', i);
this.items=null;
break;
}
}
if(this.items){
itemsInCart.push(this.items);
}
local_storage.forEach(function (item){
itemsInCart.push(item);
})
localStorage.setItem('cart', JSON.stringify(itemsInCart));
}
}
getItems(){
console.log("Cart: ", JSON.parse(localStorage.getItem('cart')));
return this.items = JSON.parse(localStorage.getItem('cart'));
//return this.items =
}
deleteItem(item){
item = item;
console.log("Deleting : ",item);
let shopping_cart;
let index;
shopping_cart = JSON.parse(localStorage.getItem('cart'));
for(let i in shopping_cart){
if (item.product.name == shopping_cart[i].product.name)
{
index = i;
console.log(index);
}
}
shopping_cart.splice(index, 1);
console.log("shopping_cart ", shopping_cart);
localStorage.setItem('cart', JSON.stringify(shopping_cart));
}
addQty(item: Item)
{
item = item;
let shopping_cart;
shopping_cart = JSON.parse(localStorage.getItem('cart'));
for(let i in shopping_cart){
if(item.product.name == shopping_cart[i].product.name){
shopping_cart[i].quantity +=1;
item = null;
break;
}
}
localStorage.setItem('cart', JSON.stringify(shopping_cart));
}
numberOfItems(){
let itemsInCart = JSON.parse(localStorage.getItem('cart'));
return itemsInCart.length;
}
clearCart(){
localStorage.clear();
}
}
答案#1
你可以为此使用 rxjs Subjects:
为您服务:
subject = new Subject<any>();
当你更新存储在 localStorage 中的值时,使用 .next
示例:
localStorage.setItem('cart', JSON.stringify(itemsInCart));
subject.next('changed');
并在你的组件内部订阅它,你可以在生命周期钩子中订阅:
ngOnInit() {
this.cartService.subscribe((status) => {
//..you will reach here when you use `.next` because this callback function gets
// executed
this.items = this.cartService.getItems();
})
}
答案#2
根据MDN,你可以监听的事件
window.addEventListener('storage', function(e) {
document.querySelector('.my-key').textContent = e.key;
document.querySelector('.my-old').textContent = e.oldValue;
document.querySelector('.my-new').textContent = e.newValue;
document.querySelector('.my-url').textContent = e.url;
document.querySelector('.my-storage').textContent = JSON.stringify(e.storageArea);
});
但如果我是你,我会在单例服务内部跟踪项目 https://angular.io/guide/singleton-services
