Javascript 如何让AngularJs购物车按预期工作
我有一个简单的购物AngularJs应用程序。它按预期显示产品列表。您可以将产品添加到购物车,它会在购物车中显示产品名称和价格,并更新总价。但是,如果添加第二个产品,它不会显示第二个产品的名称。它只是将以前添加的产品价格添加到总价格中,而不是新产品价格。因此,它不会重复您推入$scope.cart的产品 这是我的HTML:Javascript 如何让AngularJs购物车按预期工作,javascript,angularjs,twitter-bootstrap-3,Javascript,Angularjs,Twitter Bootstrap 3,我有一个简单的购物AngularJs应用程序。它按预期显示产品列表。您可以将产品添加到购物车,它会在购物车中显示产品名称和价格,并更新总价。但是,如果添加第二个产品,它不会显示第二个产品的名称。它只是将以前添加的产品价格添加到总价格中,而不是新产品价格。因此,它不会重复您推入$scope.cart的产品 这是我的HTML: <div class="row"> <div class="col-sm-8" ng-repeat="category in categories"
<div class="row">
<div class="col-sm-8" ng-repeat="category in categories">
<h2>{{category.categoryName}}</h2>
<div ng-repeat="product in category.products track by $index">
<div class="panel">
<img ng-src="{{product.image}}">
<h6>{{product.name}}</h6>
<p>{{product.price}}</p>
<button class="btn btn-sm" ng-click="addItemToCart(product)">Add to Cart</button>
</div>
</div>
</div>
<div class="col-sm-4">
<ul class="list-group" ng-repeat="products in cart">
<li class="list-group-item">
{{products.name}} |{{products.count}}| {{products.price*products.count}}
<input class="btn btn-sm btn-danger" type="button" ng-click="removeItemCart(products)" value="Remove" />
</li>
<h5>Number of items in cart: {{productsNumber}}</h5>
</ul>
<h4>Total: R{{total}}.</h4>
<button class="btn btn-sm btn-success">Checkout</button>
</div>
</div>
</div>
{{category.categoryName}
{{product.name}
{{product.price}}
添加到购物车
-
{{products.name}}{{products.count}}{{products.price*products.count}}
购物车中的项目数:{{productsNumber}
总数:R{{Total}。
结账
这是我的AngularJs:
(function(){
var app = angular.module('myApp', ['ngCookies']);
app.controller('productsCtrl', ['$scope','$cookies', function($scope,$cookies){
$scope.categories = productsData;
// Add ids to the array objects //
$scope.categories.forEach( function(d, i){ d.id = i+1; });
$scope.cart = [];
$scope.total = 0;
$scope.productsNumber = $scope.cart.length;
if (!angular.isUndefined($cookies.get('cart'))) {
$scope.cart = $cookies.getObject('cart');
}
$scope.addItemToCart = function(product){
if ($scope.cart.length === 0){
product.count = 1;
$scope.cart.push(product);
} else {
var repeat = false;
for(var i = 0; i< $scope.cart.length; i++){
if($scope.cart[i].id === product.id){
repeat = true;
$scope.cart[i].count +=1;
}
}
if (!repeat) {
product.count = 1;
$scope.cart.push(product);
}
}
var expireDate = new Date();
expireDate.setDate(expireDate.getDate() + 1);
$cookies.putObject('cart', $scope.cart, {'expires': expireDate});
$scope.cart = $cookies.getObject('cart');
$scope.total += parseFloat(product.price);
$cookies.put('total', $scope.total, {'expires': expireDate});
};
$scope.removeItemCart = function(product){
if(product.count > 1){
product.count -= 1;
var expireDate = new Date();
expireDate.setDate(expireDate.getDate() + 1);
$cookies.putObject('cart', $scope.cart, {'expires': expireDate});
$scope.cart = $cookies.getObject('cart');
}
else if(product.count === 1){
var index = $scope.cart.indexOf(product);
$scope.cart.splice(index);
expireDate = new Date();
expireDate.setDate(expireDate.getDate() + 1);
$cookies.putObject('cart', $scope.cart, {'expires': expireDate});
$scope.cart = $cookies.getObject('cart');
}
$scope.total -= parseFloat(product.price);
$cookies.put('total', $scope.total, {'expires': expireDate});
};
}]);
var productsData = [
{
categoryName: "Gas Cylinders",
products: [
{
name: "15kg Gas Cylinder",
image: "images/gas4.jpg",
price: 50
},
{
name: "DEFY 4 Burner Gas Stove",
image: "images/stove2.jpg",
price: 90
}
]
},
{
categoryName: "Electronics",
products: [
{
name: "Samsung Galaxy J4 Core",
image: "images/j4-core.jpg",
price: 100
},
{
name: "40'' FHD Hisense TV",
image: "images/tv2.jpg",
price: 200
}
]
}
];
})();
(函数(){
var app=angular.module('myApp',['ngCookies']);
app.controller('productsCtrl',['$scope','$cookies',函数($scope,$cookies){
$scope.categories=产品数据;
//向数组对象添加ID//
$scope.categories.forEach(函数(d,i){d.id=i+1;});
$scope.cart=[];
$scope.total=0;
$scope.productsNumber=$scope.cart.length;
如果(!angular.isUndefined($cookies.get('cart'))){
$scope.cart=$cookies.getObject('cart');
}
$scope.addItemToCart=功能(产品){
如果($scope.cart.length==0){
product.count=1;
$scope.cart.push(产品);
}否则{
var repeat=false;
对于(变量i=0;i<$scope.cart.length;i++){
if($scope.cart[i].id==product.id){
重复=正确;
$scope.cart[i]。计数+=1;
}
}
如果(!重复){
product.count=1;
$scope.cart.push(产品);
}
}
var expireDate=新日期();
expireDate.setDate(expireDate.getDate()+1);
$cookies.putObject('cart',$scope.cart,{'expires':expireDate});
$scope.cart=$cookies.getObject('cart');
$scope.total+=parseFloat(产品价格);
$cookies.put('total',$scope.total,{'expires':expireDate});
};
$scope.removitemcart=功能(产品){
如果(product.count>1){
product.count-=1;
var expireDate=新日期();
expireDate.setDate(expireDate.getDate()+1);
$cookies.putObject('cart',$scope.cart,{'expires':expireDate});
$scope.cart=$cookies.getObject('cart');
}
else if(product.count==1){
var索引=$scope.cart.indexOf(产品);
$scope.cart.splice(索引);
expireDate=新日期();
expireDate.setDate(expireDate.getDate()+1);
$cookies.putObject('cart',$scope.cart,{'expires':expireDate});
$scope.cart=$cookies.getObject('cart');
}
$scope.total-=parseFloat(产品价格);
$cookies.put('total',$scope.total,{'expires':expireDate});
};
}]);
var productsData=[
{
类别名称:“气瓶”,
产品:[
{
名称:“15kg气瓶”,
图片:“images/gas4.jpg”,
价格:50
},
{
名称:“DEFY 4燃烧器燃气炉”,
图片:“images/stove2.jpg”,
价格:90
}
]
},
{
类别名称:“电子”,
产品:[
{
名称:“三星Galaxy J4核心”,
图片:“images/j4 core.jpg”,
价格:100
},
{
名称:“40寸FHD海信电视”,
图片:“images/tv2.jpg”,
售价:200
}
]
}
];
})();
我尝试将产品ID动态添加到$scope.cart,但没有帮助 我看到的第一个问题是,当您在此行中添加id时:$scope.categories.forEach(function(d,I){d.id=I+1;});它是在类别级别添加id,而不是在其内部的产品数组中添加id。productsData是数组的数组。内部阵列具有客户将添加到购物车的产品,并且应该具有ID。不在外部数组级别
因此,为产品分配ID的逻辑应该改变。否则,基于id的JS代码将失败。我看到的第一个问题是,当您在此行中添加id时:$scope.categories.forEach(function(d,I){d.id=I+1;});它是在类别级别添加id,而不是在其内部的产品数组中添加id。productsData是数组的数组。内部阵列具有客户将添加到购物车的产品,并且应该具有ID。不在外阵级。非常感谢,老兄。它解决了这个问题。