#angular
#angular
Вопрос:
Я добавляю корзину покупок в заголовок моего сайта (который является общим компонентом). Он показывает количество товаров в корзине.
Я инициализирую количество корзин при входе пользователя в систему и добавляю его в localstorage как 0.
cartCount: number = 0;
localStorage.setItem("cart_count", JSON.stringify(this.cartCount));
Когда количество товара изменяется, я устанавливаю его cart_count
следующим образом:
localStorage.setItem("cart_count", JSON.stringify(item.quantity));
Как я могу позволить ему изменять количество в моем заголовке, не обновляя страницу?
Должен ли я сделать корзину покупок в качестве нового компонента и добавить ее в заголовок, а затем обновить только этот компонент? Если да, как я могу обновить этот компонент?
Спасибо
Ответ №1:
это в значительной степени является целью общего сервиса и rxjs.
вы бы создали какую-нибудь службу корзины:
@Injectable({providedIn: 'root'})
export class CartService {
private cartCount = new ReplaySubject<number>(1);
cartCount$ = this.cartCount.asObservable();
setCartCount(count: number) {
// encapsulate with logic to set local storage
localStorage.setItem("cart_count", JSON.stringify(count));
this.cartCount.next(count);
}
constructor() {
// can check local storage here to initialize?
}
}
затем в любое время, когда вы хотите установить новое количество, вы вводите службу и вызываете setCartCount
метод, а когда вы хотите получать уведомления об обновлениях, вы вводите службу и подписываетесь на cartCount$
наблюдаемый:
constructor(private cartService: CartService) {
this.countSub = this.cartService.cartCount$.subscribe(
count => {
// this runs everytime the count changes
this.cartCount = count;
}
)
this.cartService.setCartCount(0); // init to 0?
}
ngOnDestroy() {
this.countSub.unsubscribe(); // important to unsubscribe
}
вы также можете использовать асинхронный канал вместо прямой подписки:
constructor(private cartService: CartService) {
this.cartCount$ = this.cartService.cartCount$
}
и в шаблоне используйте асинхронный канал:
{{ cartCount$ | async }}
Комментарии:
1. Я попробовал ваш код. Инициализированное значение cartcount с 0 при входе пользователя в систему. Но я застрял на том, как будет отображаться количество корзин. В шаблоне ничего не отображается. В консоли он возвращает observable, но как я могу показать число в шаблоне?
2. вся эта информация уже есть в моем ответе. вам нужно больше узнать о observables и rxjs, чтобы стать разработчиком Angular
Ответ №2:
То, что вы хотите, — это тема.
Для быстрого примера, что-то вроде этого:
export class CartService {
...
private cartCount = new Subject<number>();
...
getCartCount(): Observable<number> {
return this.cartCount.asObservable();
}
setCardCount(item: any) {
localStorage.setItem("cart_count", JSON.stringify(item.quantity));
this.cartCount.next(localStorage.getItem("cart_count"));
}
...
Комментарии:
1. Я вызываю setCardCount(0), когда пользователь входит в систему, чтобы сначала count инициализировался до 0. Но когда я вызываю getCartCount(), он не дает мне 0
2. В коде произошла ошибка. Я исправил это (
getCartCount(): Observable<number>
). Вместо числа код был логическим.3. Никаких проблем. Я уже исправил это. Проблема в том, что когда я вызываю getCartCount(), он возвращает Observable . Как я могу получить это количество корзин в шаблоне? Я пытался
{{cartCount|async}}
, но это не работает