代码之家  ›  专栏  ›  技术社区  ›  J-man

当使用ngrx和Angular 6从外部组件发射事件时,如何更新状态对象?

  •  0
  • J-man  · 技术社区  · 8 年前

    我有一个带有“保存”按钮的页脚组件,在我的Angular 6应用程序中始终可见-它是一个核心组件,除非应用程序被销毁,否则它永远不会被销毁。应用程序的每个页面在保存产品时都是不同的部分,例如“一般信息”部分、“定价”部分、“数量”部分等等。当我在应用程序中运行时,如果我在任何时候单击“保存”按钮,它都会保存产品对象的当前状态。

    我有一个 Product 如下所示的对象:

    export interface Product {
        id: number;
        name: string;
        price: number;
        qty: number;
    }
    

    constructor(private store: Store<fromProduct.State>) {}
    
    ngOnInit() {
        this.store.dispatch(new LoadAction());
        this.product$ = this.store.pipe(select(fromProducts.getProduct));
    }
    

    这样可以很好地加载产品,我可以看到 product$ 在我看来是显而易见的。但是,我不知道如何将加载的产品对象“传递”到页脚组件以保存状态。

    // Markup
    <button (click)="saveProduct($event)">Save</button>
    
    // Component
    import * as productActions from '../../product/state/actions';
    
    ...
    
    saveProduct(product: Product) {
        this.store.dispatch(new productActions.SaveProductAction(product));
    }
    

    我知道 $event 与什么都没有联系——这就是我的问题所在。我怎样才能拿到票 产品 ngrx ?

    谢谢

    1 回复  |  直到 8 年前
        1
  •  1
  •   Guerric P    8 年前

    我建议您将Save button click事件传播到表单所在的位置。

    如果表单是直接的父级或同级,那么只需使用 @Input() @Output() Observable 在窗体和按钮之间,如下所示:

    @Injectable()
    export class EventService{
    
      private subject= new Subject<any>();
    
      saveButtonClicked = this.subject.asObservable();
    
      constructor() { }
    
      saveButtonClick() {
        this.subject.next();
      }
    }
    

    <button (click)="onSaveClick()">Save</button>
    

    页脚类型脚本:

    onSaveClick() {
       this.eventService.saveButtonClick();
    }
    

    您的不同表格:

    this.eventService.saveButtonClicked.subscribe(res => {
       // Your save logic
    });