1. Code
Si vous êtes intéressé à voir cet effet et que vous voulez savoir comment le réaliser, continuez à lire. Pas grand chose à dire, il suffit d'aller directement au code.
code html :
<!DOCTYPE html> <html ng-app="cart"> <head> <meta charset="UTF-8"> <title>购物车</title> <link rel="stylesheet" href="../scripts/angular-1.4.0-rc.2/docs/components/bootstrap-3.1.1/css/bootstrap.min.css"> <link rel="stylesheet" href="main.css"> </head> <body ng-controller="cartCtr"> <table class="table table-hover" ng-show="items.length"> <caption>AngularJS实现购物车</caption> <tr> <th>序号</th> <th>商品信息</th> <th>单价(元)</th> <th>数量</th> <th>金额(元)</th> <th>操作</th> </tr> <tr ng-repeat=" item in items"> <td>{{$index + 1}}</td> <td><a href="{{item.linkUrl}}" target="_blank" title="此链接将跳转到淘宝相关页面...">{{item.title}}</a></td> <td>{{item.price|number:2}}</td> <td> <button type="button" class="btn btn-default btn-xs" ng-click="reduce(item.id)" ng-disabled="item.quantity<=1">-</button> <input type="text" size="5" ng-model="item.quantity" ng-keydown="quantityKeydown()" ng-keyup="quantityKeyup()"> <button type="button" class="btn btn-default btn-xs" ng-click="add(item.id)">+</button> </td> <td class="bold mark">{{item.price*item.quantity|number:2}}</td> <td> <button type="button" class="btn btn-default btn-xs" ng-click="delete(item.id)">删除</button> </td> </tr> </table> <div ng-show="!items.length">购物车空空,快去寻找宝贝</div> <div> 已选商品:<span>{{getQuantites()}} </span> 合计: <span class=" mark" ng-show="getTotalAmount()<15000">{{getTotalAmount()|number:2}}</span> <span class=" mark" ng-show="getTotalAmount()>=15000"> {{getTotalAmount()*discount|number:2}}<span class="btn btn-xs">(9折)</span> <span>({{getTotalAmount()|number:2}})</span> </span> <button type="button" class="btn btn-primary btn-sm" ng-click="alertSubmit()">结 算</button> </div> <script src="../scripts/angular-1.4.0-rc.2/angular.js"></script><script src="app.js"></script> </body> </html>
code js :
/ Created by wqq on 2016/5/25. / var cartModule = angular.module('cart', []); cartModule.controller('cartCtr', ['$scope', function ($scope) { $scope.discount = 0.9; $scope.items = [{id: 10001,title: "Web全栈工程师的自我修养 余果", price: 40.80,quantity: 2,linkUrl: "https://detail.tmall.com/item.htm?spm=a1z0d.6639537.1997196601.4.cwywJs&id=532166746631"}, {id: 10002,title: "MacBook Pro Retina 15英寸", price: 16088.00,quantity: 1,linkUrl: "https://detail.tmall.com/item.htm?spm=a1z0d.6639537.1997196601.26.cwywJs&id=45771116847"}, {id: 10003,title: "Surface Book I5 128G 独显",price: 11088.00, quantity: 1,linkUrl: "https://detail.tmall.com/item.htm?spm=a1z0d.6639537.1997196601.15.cwywJs&id=525614504276"}, {id: 10004, title: "Lenovo Yoga3Pro I5 4G",price: 7299.00, quantity: 1,linkUrl: "https://detail.tmall.com/item.htm?spm=a1z0d.6639537.1997196601.37.cwywJs&id=41541519814"} ]; $scope.add = function (id) { angular.forEach($scope.items, function (item, index, array) { if (item.id === id) {item.quantity++;} }) }; $scope.reduce = function (id) { angular.forEach($scope.items, function (item, index, array) { if (item.id === id) {item.quantity--; } }) }; //输入框添加keydown事件,避免输入非正整数 $scope.quantityKeydown = function (event) { event = event || window.event; var target=event.target||event.srcElement; var keycode = event.keyCode; if ((37 <= keycode && keycode <= 40)||(48 <= keycode && keycode <= 57) || (96 <= keycode && keycode <= 105) || keycode == 8) { //方向键↑→ ↓←、数字键、backspace } else { console.log(keycode); event.preventDefault(); return false; } }; //keyup事件,当输入数字为0时,重新刷新文本框内容 $scope.quantityKeyup = function (event) { event = event || window.event; var target=event.target||event.srcElement; var keycode = event.keyCode; if (48 === keycode || 96 === keycode ) { target.value=parseInt(target.value); }}; //删除商品 $scope.delete = function (id) { $scope.items.forEach(function (item, index) { if (item.id == id) { if (confirm("确定要从购物车中删除此商品?")) { $scope.items.splice(index, 1); return; } } }) }; //计算已选商品数量 $scope.getQuantites = function () { var quantities = 0; angular.forEach($scope.items, function (item, index, array) { if (item.quantity) { quantities += parseInt(item.quantity); } }); return quantities; }; //计算合计总金额 $scope.getTotalAmount = function () { var totalAmount = 0; angular.forEach($scope.items, function (item, index, array) { totalAmount += item.quantity * item.price; }); return totalAmount; }; $scope.alertSubmit = function () {alert("Angular实现购物车"); } }]);
2. Analyse
Veuillez ignorer le style bootstrap, nous seulement Focus sur Angular, le code est très simple, analysons-le brièvement :
1 Préparation
Nous définissons d'abord un module cart et un contrôleur cartCtr, et les présentons dans le html. code, nous avons également défini un tableau d'éléments en js pour simuler le contenu du panier.
2. itérateur ng-repeat
Afin de charger dynamiquement les données dans les éléments, nous utilisons l'instruction intégrée ng-repeat dans Angular, qui peut être très pratique Traverse le tableau et générer des éléments DOM. Ici, quatre balises
<tr ng-repeat=" item in items">
item est un objet dans le tableau items. dans in js ? Loop~~ Si vous êtes un développeur .net et avez utilisé Razor d'asp.net mvc, vous serez très familier avec le fonctionnement transparent des éléments DOM dans d'autres langages. Quant à savoir si Java et PHP ont une syntaxe similaire, Je ne sais pas. Oui, je suis un développeur .net assidu.
itérateur ng-repeat
Nous pouvons voir que $index est utilisé dans le premier td, qui est dans ng-repeat, pas ce que nous définissons est que sa valeur est l'index de l'élément actuel dans items, à partir de 0, nous utilisons donc $index 1 comme numéro de série, et il existe d'autres liaisons de données (similaires à item.linkUrl).
Nous avons utilisé {{ xxx|number:2}} dans les colonnes prix unitaire et montant. Il s'agit d'un filtre dans Angular. Sa fonction est de conserver la valeur précédente xxx à deux décimales. pour le montant, il faudra bien sûr être plus précis. Je viens de dire que c'est une sorte de filtre, mais il y en a d'autres, comme la devise. Vous pouvez ajouter un signe $ devant xxx pour représenter le dollar américain. Vous pouvez utiliser Baidu vous-même.
3. Ajouter des événements
Il existe des boutons de quantité, - et de suppression sur l'interface actuelle. Ces événements sont relativement simples. Utilisez ng-click pour ajouter des événements de clic aux éléments. . En passant l'ID d'un produit, nous pouvons trouver le produit et ajouter, soustraire et supprimer le produit. Cependant, une balise ng-disabled est ajoutée au bouton "-". En fonction du nom, nous pouvons facilement penser au HTML. . L'attribut désactivé, sa fonction est de désactiver l'élément DOM lorsque la valeur de ng-disabled est vraie. De même, le ng-show utilisé ci-dessous est le même. Il est affiché lorsqu'il est vrai et masqué lorsqu'il est faux. S'il s'agit d'un nombre, il sera automatiquement converti en valeur booléenne. 0 est faux, non-0 est vrai, et notez que les nombres négatifs sont également vrais ! . Ici, je rends impossible la réduction du nombre lorsqu'il est 1, car peu importe sa petite taille, il peut être supprimé directement~
Ajoutez ensuite l'événement ng-keydown à l'élément d'entrée pour que seules les touches de direction peuvent être saisies ↑ → ↓←, les touches numériques, le retour arrière. Ensuite, je l'ai essayé et j'ai atteint l'objectif, mais j'ai pu saisir des chiffres comme "00021", ce qui n'était évidemment pas satisfaisant. J'ai regardé le panier de Taobao et j'ai découvert que lorsque 0 était saisi devant, le contenu de cette zone de texte actualisait et supprimait automatiquement le 0 devant, j'ai donc ajouté l'événement ng-keyup :
$scope.quantityKeyup = function (event) { event = event || window.event; //兼容IE8以下,target也是 var target=event.target||event.srcElement; var keycode = event.keyCode; if (48 === keycode || 96 === keycode ) { target.value=parseInt(target.value); }};
Lorsque j'entre 0, la valeur de la zone de texte s'actualisera automatiquement. Pourquoi ne pas l'ajouter à keydown mais ajouter un autre événement ? En effet, lorsque l'événement keydown est déclenché, la valeur de target.value est toujours la valeur d'origine, qui n'inclut pas l'entrée key cette fois. Après keydown, la valeur est la nouvelle valeur. À ce moment, nous pouvons alors déclencher l'événement. événement keyup pour atteindre l'objectif. Vous pouvez comparer l'effet du panier Taobao. Je pense que mon expérience est meilleure que cela, car la zone de texte perdra toujours le focus tant que le numéro n'est pas saisi à la fin. . .
4. Statistiques
La quantité statistique est une méthode de liaison directe qui parcourt le tableau et renvoie la valeur.
Pour le montant total, j'ai réalisé un design qui offre une remise de 10 % pour les achats supérieurs à 15 000. Utilisez ng-show pour masquer et afficher le montant total avec les informations de réduction.
3. Résumé
JS utilise plusieurs forEach pour parcourir les tableaux. La méthode native dans ECMAScript5 est array.forEach(function(item,index,array){}); >