You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular库存管理项目如何跨组件访问属性并同步服务数据

问题根因

你现在遇到的无法同步更新StockService属性、跨组件无法共享数据的问题,核心是两个错误导致的:

  • 服务注册范围错误:你在StockComponent的@Component配置项中单独声明了providers: [StockService],这会让每个StockComponent实例都生成独立的StockService实例,SalesComponent获取到的是另一个服务实例,天然做不到数据共享。
  • 仅修改了数组副本:你在StockService的getStock()方法中通过slice()返回了原库存数组的浅拷贝,你在组件中往这个拷贝数组里新增元素,完全不会影响服务中存储的原始数组,自然服务里的属性不会更新。
修复方案

步骤1:改造StockService为全局单例,补充操作方法和响应式通知

首先把StockService改成全局单例,同时新增库存增删方法,搭配RxJS Subject实现库存变化的实时通知,后续SalesComponent和StockComponent都能自动拿到最新数据:

import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
import { Stock } from "./stock/stock.model";

@Injectable({
  providedIn: 'root' // 声明为全局单例,全应用共用一个服务实例
})
export class StockService {
  // 用BehaviorSubject存储库存,支持订阅变化
  private stocksSubject = new BehaviorSubject<Stock[]>([
    new Stock(1, 'OG Kush', 10, 'Grams', 'Kanja', new Date(), 1000, 'test'), 
    new Stock(2, 'Thai Stick', 50, 'Grams', 'Kanja', new Date(), 2000, 'test remark')
  ]);
  // 对外暴露只读的可观察对象,避免外部直接修改数据源
  stocks$ = this.stocksSubject.asObservable();

  // 获取当前库存快照
  getStock() {
    return this.stocksSubject.value.slice();
  }

  // 新增库存方法
  addStock(newStock: Stock) {
    const currentStocks = this.stocksSubject.value;
    currentStocks.push(newStock);
    this.stocksSubject.next([...currentStocks]); // 触发更新通知
  }

  // 扣减库存方法,供SalesComponent调用
  deductStock(stockId: number, deductAmount: number) {
    const currentStocks = this.stocksSubject.value.map(stock => {
      if (stock.id === stockId) {
        return {...stock, amount: Math.max(0, stock.amount - deductAmount)};
      }
      return stock;
    });
    this.stocksSubject.next(currentStocks);
  }
}

步骤2:修改StockComponent代码

删除组件独立的服务注册,提交新增库存时调用服务的新增方法,不要直接修改本地数组:

import { Component, OnInit } from '@angular/core';
import { NgForm } from '@angular/forms';
import { StockService } from '../stock.service';
import { Stock } from './stock.model';

@Component({
  selector: 'app-stock',
  templateUrl: './stock.component.html',
  styleUrls: ['./stock.component.css']
  // 删掉原来的providers: [StockService],用全局单例
})
export class StockComponent implements OnInit {
  Stocks: Stock[];

  constructor(private stockService: StockService) {}

  ngOnInit() {
    // 直接订阅库存变化实现实时更新
    this.stockService.stocks$.subscribe(stocks => {
      this.Stocks = stocks;
    });
  }

  onSubmit(form: NgForm) {
    const value = form.value;
    const dateAdd = new Date();
    const newStock = new Stock(value.id, value.name, value.amount, value.unit, value.type, dateAdd, value.cost, value.remark);
    // 调用服务的新增方法,不要直接push本地数组
    this.stockService.addStock(newStock);
    form.resetForm();
  }
}

步骤3:SalesComponent中使用库存数据

直接注入StockService,订阅库存即可拿到实时数据,完成售卖时调用扣减方法即可同步更新库存:

// SalesComponent核心代码示例
import { Component, OnInit } from '@angular/core';
import { StockService } from '../stock.service';
import { Stock } from './stock.model';

@Component({
  selector: 'app-sales',
  templateUrl: './sales.component.html'
})
export class SalesComponent implements OnInit {
  availableStocks: Stock[] = [];

  constructor(private stockService: StockService) {}

  ngOnInit() {
    // 订阅实时库存列表
    this.stockService.stocks$.subscribe(stocks => {
      // 过滤出库存大于0的可售卖商品
      this.availableStocks = stocks.filter(s => s.amount > 0);
    });
  }

  // 售卖完成调用该方法
  onSale(stockId: number, saleAmount: number) {
    this.stockService.deductStock(stockId, saleAmount);
  }
}

修改完成后所有组件共享同一个StockService实例,所有库存操作都通过服务统一处理,数据会自动在两个组件间同步。

内容的提问来源于stack exchange,提问作者Thanapol Raktham

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 00:57:03