使用AngularJS进行动态数据计算

时间:2016-03-03 09:31:17

标签: javascript angularjs data-binding

我想在嵌套重复中使用子总数,将其视为商店购物车,但购物车分为产品(鞋子,夹克)或其他嵌套结构。

所以我认为有(至少)3种不同的方法来实现相同的结果。有什么区别,特别是性能,我应该使用哪些(对于大量数据)?

值得注意的是,这更多是关于数据呈现(如管理员视图),而不仅仅是关于如何累计购物车的问题(已经涵盖了很多!)。更多关于如何从数据的角度处理它,当你有很多购物车和许多其他计算,如平均成本,累积成本..周二(或任何!)人喜欢的颜色。

在模板

    <table>
    <tr ng-repeat="product in cart.products">
        <td>{{product.name}}</td>
        <table>
            <tr ng-repeat="item in product.items">
                <td>{{item.name}}</td>
                <td>{{item.cost}}</td>
            </tr>
        </table>
        <td>{{ getProductTotal(product) }}</td>
    </tr>
    <tr>{{ getCartTotal() }}</tr>
</table>

对象的属性

$scope.cart = {
    person: "Nicky poppy pie",
    products: {},
    total: function () {
        var total = 0;
        foreach(product...)
        return total;
    }
};

$scope.cart = {};
$scope.cart.total = getCartTotal()

function getCartTotal() {
    //insert crazy calculations
}

$scope.$watch('cart', function() {
    var cartTotal = 0;
    $scope.cartItems.forEach(function(product) {
      cartTotal += product.cost();
    });
    $scope.cartTotal = cartTotal;
}, true);

2 个答案:

答案 0 :(得分:0)

我认为你是以错误的方式接近它。

您应该将总数作为购物车对象的属性。在您的视图中,您可以正常绑定它。 您不希望在每个$ scope上进行所有“疯狂计算”。$ digest但只在以下时间执行一次:

  • 添加了产品(例如:cart.addProduct(product))
  • 产品已移除(例如:cart.removeProduct(product))
  • 数量已更改(例如:cart.updateQtyProduct(productId,qty))
  • ...

在每个方法结束时,您调用updateTotalCart()方法并在对象上设置属性。

答案 1 :(得分:0)

来自 angularjs表达式的官方文档:

如果您想运行更复杂的JavaScript代码,您应该将其设置为控制器方法并从您的视图中调用该方法。 angularjs doc link

我认为这基本上意味着如果你认为你的计算足够简单,你可以使用角度表达式。

但如果计算复杂,最好使用控制器方法。