首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我想用Angularfire2计算Firebase上的Angularfire2之和

我想用Angularfire2计算Firebase上的Angularfire2之和
EN

Stack Overflow用户
提问于 2016-11-27 20:46:36
回答 2查看 2.4K关注 0票数 0

我正在构建一个使用Angular2、Firebase和AngularFire2的实验性应用程序。我的数据就是这样的:

代码语言:javascript
复制
{
  "ShoppingCartItem":
      {
        "item1":{
            "quantity": 2,
            "productId": "abc"
        },
        "item2":{
            "quantity": 1,
            "productId": "bcd"
        }
      }
  "Product"
      {
        "abc":{
            "name": "product1",
            "price": 5
    },
        "bcd":{
            "name": "product2",
            "price": 6
        }
    }
}

下面是我的cart.ts

代码语言:javascript
复制
this.items = this.af.database.list('ShoppingCartItem')
          .map(carts => {
            return carts.map(item => {
              item.product = this.af.database.object(`Product/${item.productId}`);
              return item;
            });
          });

下面是我的cart.html

代码语言:javascript
复制
<table>
<tbody>
    <tr *ngFor="let item of (items | async)">
        <td>{{(item.product | async)?.name}}</td>
        <td><input type="text" name="quantity" [(ngModel)]="item.quantity" size="1" class="form-control"></td>
        <td>{{(item.product | async)?.price | number: '.2'}}</td>
        <td>{{(item.product | async)?.price * item.quantity | number: '.2'}}</td>
    </tr>
</tbody>
<tfoot>
    <tr>
      <td colspan="2" class="text-right">
        <strong>Total :</strong>
      </td>
      <td colspan="2" class="text-left">
        ?????????
      </td>
    </tr>
</tfoot>

我要计算ShoppingCart之和。所以我想找到数据显示的(2*5) + (1*6) = 16的值。我该怎么做。

这个柱塞

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-13 07:54:37

问题在于这段代码:

代码语言:javascript
复制
carts.map(cart => {
    this.af.database.object(`Product/${cart.productId}`)
    .subscribe(d => {
        cart.product = d;
    });
  return cart;
});
carts.forEach(cartItem => {
    qty += cartItem.quantity;
    total += cartItem.quantity * cartItem.product.price;
    // console.log(cartItem);
});

两个调用:carts.mapcarts.forEach是同步的,并且一个接一个地发生。但是产品的加载(通过af.database.object)是异步的,所以当您在cartItem产品上迭代时还没有加载。

解决方案将是链式产品装载和总计算。见这里

票数 1
EN

Stack Overflow用户

发布于 2016-12-09 06:08:43

由于您正在使用Firebase,我首先注意到的是关键名称。就这样把他们治好。其中cart.$key是一些哈希码,例如-KXeML1Na9qCsvK4JSyQ

代码语言:javascript
复制
{
  "ShoppingCartItem": {
    -KXeML1OkDyUVTAdHYPx : {
      -KXeML1OkDyUVTAdHYPx: true,
      -KXeML1PP4faQG2Z3fzU: true
    },
    -KXeML1Na9qCsvK4JSyQ: {
      -KXeML1PP4faQG2Z3fzU: true
    }
  },
  "Products": {
    -KXeML1OkDyUVTAdHYPx:{
      "name": "product1",
      "price": 5
    },
    -KXeML1PP4faQG2Z3fzU:{
      "name": "product2",
      "price": 6
    }
  }
}

现在重写你的前端逻辑。请编写并导出合适的Product类。放在下面的shoppingcart.service.ts里面

代码语言:javascript
复制
findProductKeysForCart(cartId: string): Observable<string[]> {
 return this.database.list('ShoppingCartItem', {
    query: {
      orderByKey: true,
      equalTo: cartId
    }
  })
    //.do(console.log)// Check whats coming,
    //.map(result => result[0])// might be needed
    .map(sci => sci.map(product => product.$key));
}

findProductsForProductKeys(productKeys$: Observable<string[]>): Observable<Product[]> {
  return productKeys$
    .map(productKeys => productKeys.map(productKey => this.database.object(`Products/${productKey}`)))
    .flatMap(prodObservables => Observable.combineLatest(prodObservables));
}


findAllProductsForCart(cartId): Observable<Product[]> {
    //this fn gets your Products for a cart
    return this.findProductsForProductKeys(this.findProductKeysForCart(cartId));
}

现在,在Product中或订阅中进行最后的计算。下面将进入DisplayCart.component.ts内部

代码语言:javascript
复制
items;
constructor(private shoppingCartService: ShoppingCartService){}

ngOnInit(){
  const items$ = this.shoppingCartService.findAllProductsForCart(this.cartId);

 items$.subscribe(items => this.items = items);
}

你还需要自己完成剩下的工作,祝你好运。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40833704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档