1. 程式人生 > >angularJS 購物車練習

angularJS 購物車練習

    本文是一個簡單的購物車練習,功能包括增加、減少某商品的數量,從而影響該商品的購買總價以及所有商品的購買總價;從購物車內移除一項商品;清空購物車。

頁面效果如圖:


    若使用js或jquery來實現這個頁面,會需要繫結很多事件,如減少數量按鈕事件,增加數量按鈕事件,移除某項商品事件,清空購物車事件,而這些事件之中很多程式碼很重複,比如計算某項商品的總購買價,計算所有商品的購買總價,不勝其煩,現在有了angularJs,則簡單許多,因為資料模型雙向繫結等原因。

上圖頁面的程式碼:

html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>angular購物車練習</title>
    <link rel="stylesheet" href="../../vendor/bootstrap3/css/bootstrap.css">
    <script src="../../vendor/angular/angular.min.js"></script>
    <script src="app/index2.js"></script>
</head>
<body ng-app="myApp" ng-controller="myCtrl">
<div class="container">
    <table class="table" ng-show="cartList.length > 0">
        <thead>
        <tr>
            <th>產品編號</th>
            <th>產品名稱</th>
            <th>購買數量</th>
            <th>產品單價</th>
            <th>產品總價</th>
            <th>操作</th>
        </tr>
        </thead>
        <tbody>
        <tr ng-repeat="item in cartList">
            <td>{{item.id}}</td>
            <td>{{item.name}}</td>
            <td>
                <button ng-click="reduceOne(item.id)" class="btn btn-primary">-</button>
                <input type="text" ng-model="item.quantity">
                <button ng-click="addOne(item.id)" class="btn btn-primary">+</button>
            </td>
            <td>{{item.price}}</td>
            <td>{{item.quantity * item.price}}</td>
            <td><button ng-click="remove(item.id)" class="btn btn-danger">移除</button></td>
        </tr>
        <tr>
            <td>總購買價</td>
            <td>{{totalCost()}}</td>
            <td>總購買數量</td>
            <td>{{totalCount()}}</td>
            <td colspan="3"><button ng-click="cartList=[]" class="btn btn-danger">清空購物車</button></td>
        </tr>
        </tbody>
    </table>
    <h4 ng-show="cartList.length < 1">您的購物車暫無商品</h4>
</div>

</body>
</html>

index2.js :

var app=angular.module("myApp",[]);
app.controller("myCtrl",function($scope){
    $scope.cartList=[
        {id:1000,name:"iphone5s",quantity:3,price:4300},
        {id:1001,name:"iphone5",quantity:30,price:3300},
        {id:1002,name:"imac",quantity:3,price:3000},
        {id:1003,name:"ipad",quantity:5,price:6900}
    ];

    var findIndex=function(id){
        var index=-1;
        angular.forEach($scope.cartList,function(item,key){
            if(item.id == id){
                index=key;
                return;
            }
        });return index;
    };

    //從cartList陣列中刪除一項產品
    $scope.remove=function(id){
        var index=findIndex(id);
        if(index != -1){
            $scope.cartList.splice(index,1);
        }
    };

    //為某個商品新增一個數量
    $scope.addOne=function(id){
        var index=findIndex(id);
        if(index != -1){
            $scope.cartList[index].quantity ++;
        }
    };
    //位某個商品減少一個數量
    $scope.reduceOne=function(id){
        var index=findIndex(id);
        if(index != -1){
            var item=$scope.cartList[index];
            if(item.quantity > 1){
                item.quantity --;
            }else{
                var returnKey=confirm("刪除該商品?");
                if(returnKey){
                    $scope.remove(item.id);
                }
            }
        }
    };

    //總購買價
    $scope.totalCost=function(){
        var total=0;
        angular.forEach($scope.cartList,function(item,key){
            total += item.quantity * item.price;
        });return total;
    };
    //總購買數量
    $scope.totalCount=function(){
        var count=0;
        angular.forEach($scope.cartList,function(item,key){
            count += item.quantity;
        });return count;
    };

    //監聽輸入框更改事件避免輸入負數或字串
    $scope.$watch('cartList',function(newValue,oldValue){
        console.log( "$scope.cartList === newValue "+ ($scope.cartList === newValue) ); //永遠為ture newValue指向cartList
        console.log( "$scope.cartList === oldValue "+ ($scope.cartList === oldValue) ); //頁面初始化後為true 一旦改動永遠為false
        angular.forEach(newValue,function(item,key){
            if( isNaN(item.quantity) ){
                item.quantity=oldValue[key].quantity;
            }
            else if( item.quantity <= 0 ){
                var returnKey=confirm("刪除該商品?");
                if(returnKey){
                    $scope.remove(item.id);
                }else{
                    item.quantity=oldValue[key].quantity;
                }
            }
        });
    },true);

});
頁面中的指令:
ng-app         指定一個應用程式
ng-controller  指定一個控制器
ng-show        值表示式為 true 時,顯示本Dom
ng-repeat      重複本Dom
ng-click       指定一個單擊事件