Meteor Mongo.Cursor #map没有达到预期的效果

时间:2017-04-19 15:49:44

标签: javascript meteor meteor-blaze

我有一个名为Cart的客户端本地集合,它包含产品对象。我想要做的是将模板中所有产品和数量的总和返回给模板。我这样做如下:

Template.layout.helpers({

  cartTotal: () => {
    if( !Cart.findOne({}) ) {
      return 0;
    }
    else {
      let productsCursor = Cart.find({});
      let totalPrice = 0;

      productsCursor.map((product) => {
        let subtotal = product.qty*product.price;
        totalPrice =+ subtotal;
        console.log(totalPrice);
      });

      return totalPrice.toFixed(2);
    }
  }
});

当我将相同的产品添加到集合中时(将product.qty增加1),一切都很好,但是当我将另一个对象添加到Cart集合时,它开始求和只有这个对象的数量和价格。

如果我在浏览器控制台上检查Collection,那么所有对象都在那里,但cartTotal方法的结果没有返回正确的值。

我已经尝试过使用Mongo.Cursor#forEach()方法,但结果是一样的。我怎样才能实现我想做的事情?有什么不对?

3 个答案:

答案 0 :(得分:0)

这可能与反应性有关。尝试直接映射光标,而不是将其保存为变量,如下所示:

Template.layout.helpers({

  cartTotal: () => {
    if( !Cart.findOne({}) ) {
      return 0;
    }
    else {

      let totalPrice = 0;

      Cart.find({}).map((product) => {
        let subtotal = product.qty*product.price;
        totalPrice =+ subtotal;
        console.log(totalPrice);
      });

      return totalPrice.toFixed(2);
    }
  }
});

答案 1 :(得分:0)

我不确切地知道这是关于minimongo还是babel的错误,但用totalPrice =+ subtotal;代替totalPrice = totalPrice + subtotal;工作。

答案 2 :(得分:0)

您的代码和答案代码之一都包含=+

毫不奇怪,您只获得一种产品的总价,因为您没有调整价格,而是在每次迭代中重写它:

// let total price be the subtotal with positive sign
totalPrice = +subtotal;

你的意思是+=,这是不一样的。

我鼓励你尝试功能性方法:

Template.layout.helpers({
  cartTotal() {
    Cart.find()
    .map(product => product.qty * product.price)
    .reduce((prev, curr) => prev + curr, 0)
    .toFixed(2);
  }
});