GVKun编程网logo

利用Angularjs和bootstrap实现购物车功能(javascript购物车)

19

如果您想了解利用Angularjs和bootstrap实现购物车功能的相关知识,那么本文是一篇不可错过的文章,我们将对javascript购物车进行全面详尽的解释,并且为您提供关于angular.js

如果您想了解利用Angularjs和bootstrap实现购物车功能的相关知识,那么本文是一篇不可错过的文章,我们将对javascript购物车进行全面详尽的解释,并且为您提供关于angular.js实现购物车功能、angularjs – Angular bootstrap typeahead不能使用Angular 1.3.0、angularjs – Angular JS UI Bootstrap选项卡(ui.bootstrap.tabs)导致页面滚动/跳转选择、angularjs – angular.bootstrap启动后unbootstrap?的有价值的信息。

本文目录一览:

利用Angularjs和bootstrap实现购物车功能(javascript购物车)

利用Angularjs和bootstrap实现购物车功能(javascript购物车)

先来看看效果图:


购物车

一、代码

如果看了这个效果有兴趣想知道怎么做出来的话,那就继续往下看吧。话不多少,直接上代码。

html代码:

<!DOCTYPE html>
<html lang="en" 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">
<tableng-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"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"ng-click="add(item.id)">+</button>
 </td>
 <td>{{item.price*item.quantity|number:2}}</td>
 <td>
  <button type="button"ng-click="delete(item.id)">删除</button>
 </td>
 </tr>
</table>
<divng-show="!items.length">购物车空空,快去寻找宝贝</div>
<div>
 已选商品:<span>{{getQuantites()}} </span>
 合计:
 <spanng-show="getTotalAmount()<15000">{{getTotalAmount()|number:2}}</span>
 <spanng-show="getTotalAmount()>=15000">
 {{getTotalAmount()*discount|number:2}}<span>(9折)</span>
 <span>({{getTotalAmount()|number:2}})</span>
 </span>
 <button type="button"ng-click="alertSubmit()">结 算</button>
</div>
<script src="../scripts/angular-1.4.0-rc.2/angular.js"></script><script src="app.js"></script>
</body>
</html>

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实现购物车"); }
}]);

二、分析

请忽略bootstrap的样式,我们只关注Angular,代码很简单,我们来简单的分析一下:

1. 准备

首先我们我们定义了一个cart模块、cartCtr控制器,并将它们引入到了html代码中,同时我们还在js中定义了一个数组items用于模拟购物车内的东西。

2. ng-repeat迭代器

为了将items里的数据动态的遍历加载出来,我们使用Angular里的内置指令ng-repeat,它可以非常方便的遍历数组,生成DOM元素,在这里循环生成了4个<tr>标签:

  <tr ng-repeat=" item in items">

item就是items数组里面的某一个对象,是不是感觉这就是js中的for/in循环~~如果你是一名.net开发人员,用过asp.net mvc的Razor就对这种其他语言无缝操作DOM元素很熟悉了,至于java、PHP是否有没有类似的语法我就不清楚了,我是一名苦逼的.net开发。


ng-repeat迭代器

我们可以看到第一个td中用到了$index,这是ng-repeat内的,并不是我们定义的,它的值是当前itemitems中的索引,从0开始,所以我们用$index+1作为序号,其他的还有(类似item.linkUrl)数据绑定。

我们在单价和金额两列用到了{{ xxx|number:2}},这是Angular中的一种过滤器,作用是将前面的值xxx保留两位小数,金额嘛,我们当然要精确一些。刚才说了这是一种过滤器,那就还有其他的,比如currency,可以在xxx前面添加一个$符号表示美元,可以自行百度其他过滤器用法。

3. 添加事件

当前界面上分别有数量+、-按钮、删除按钮,这几个事件都比较简单,利用ng-click给元素添加点击事件。通过传递某个商品的id,找到这个商品,对这个商品进行加、减、删除操作,只不过在“-”按钮上有添加了一个ng-disabled标签,根据名字我们就可以很容易想到html的disabled属性,它的作用就是当ng-disabled的值为true时DOM元素禁用,同理,下面用到的ng-show也是一样的,true时显示,false时隐藏。如果是数字的话会自动转化为boolean值,0是false,非0是true,注意负数也是true!。这里我让当数量为1时就不能减少了,因为再少就可以直接删除了呀~

然后在input元素添加ng-keydown事件,使其只能输入方向键↑→ ↓←、数字键、backspace。然后我试了下确实到达了目的,但是却可以输入类似“00021”这种数字,显然这并不能令人满意。我看了看淘宝的购物车,发现当在前面输入0时,这个文本框的内容会自动刷新,去掉前面的0,于是我又添加了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);
 }};

这时当我输入0时,文本框值就会自动刷新,为什么不添加到keydown里面而要另外再加一个事件呢?那是因为触发keydown事件时target.value的值还是原来的值,还没有包含本次输入的按键,而在keydown之后值就是新值了,这时候我们接着让触发keyup事件就可以达到目的了,可以对照看下淘宝购物车的效果,我觉得我的体验比它的更好,因为它只要不是在最后输入数字文本框总是会失去焦点。。。

4. 统计

统计数量就是直接绑定方法,遍历数组返回值。

合计金额这块,我做了个满15000打9折的设计。利用ng-show隐藏显示带打折信息的合计金额。

三、总结

js中用到了几处forEach遍历数组,ECMAScript5中原生的方法是array.forEach(function(item,index,array){});

angular中也封装了,angular.forEach(array,function(item,index,array){});

代码中我两种方法都用到了,也不知道那种性能好。。

至此,购物车就已经完成了,利用Angular的双向绑定,可以快速的实现数量、金额的联动改变。希望这篇文章的内容对大家学习和使用Angular能有所帮助,如果有疑问可以留言交流。

您可能感兴趣的文章:
  • 使用Angular.js实现简单的购物车功能
  • Angularjs 制作购物车功能实例代码
  • Angular实现购物车计算示例代码
  • angular和BootStrap3实现购物车功能
  • AngularJS 购物车全选/取消全选功能的实现方法
  • angular.js实现购物车功能
  • angularjs实现简单的购物车功能
  • AngularJS 实现购物车全选反选功能
  • AngularJs 终极购物车(实例讲解)
  • Angular动画实现的2种方式以及添加购物车动画实例代码

angular.js实现购物车功能

angular.js实现购物车功能

本文实例为大家分享了angular.js购物车功能的具体代码,供大家参考,具体内容如下

rush:xhtml;"> <Meta charset="UTF-8"> 购物车 Box">

我的购物车

Box1">
Box2"> 删除

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小编。

总结

以上是小编为你收集整理的angular.js实现购物车功能全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

angularangular购物车购物车

JavaScript相关文章

2022最全最新前端面试题(附加解答)
这是我整理所有看过的文章的面试题+各种百度每一道题的答案,希望可以有效的帮助别人本章博客,梳理所有基础的js,jquery,vue,css, html等题,包含面试题,可供参考学习,也督促自我学习
前端面试八股文(详细版)—上
前端面试八股文,知识点广而全,内容会及时更新
Js运算符
JavaScript 语言的算术运算符是使用数字值作为操作数,进行运算之后返回一个数字值。算术运算符+,-,*,/,%% => 模(余数)
【Vue】webpack的基本使用
好处:前端开发自成体系,有一套标准的开发方案和流量。概念: webpack是前端项目工程化的具体解决方案。主要功能:它提供了友好的前端模块化开发支持,以及代码压缩混淆,处理浏览器端JavaScript的兼容性性能优化等强大的功能。好处:让程序员把工作的重心放到具体功能的实现上,提高了前端开发效率和项目的可维护性。注意:目前Vue,React等前端项目,基本上都是基于webpack进行工程化开发的。步骤import和require导入模块的区别1、require对应导出的方法是module.export
Pro3:js实现放大镜效果
JavaScript练习项目第三个:js实现放大镜的效果。
【2022-11-26】JS逆向之北京百姓网
北京百姓网cookie逆向
你评论,我赠书~【TFS-CLUB社区 第9期赠书活动】〖HTML5+CSS3+JavaScript从入门到精通(微课精编版)(第2版)〗等你来拿
你评论,我赠书~【TFS-CLUB社区 第9期赠书活动】〖HTML5+CSS3+JavaScript从入门到精通(微课精编版)〗等你来拿
App逆向案例 X嘟牛 - Frida监听 & WT-JS工具还原(一)
App逆向 X嘟牛 - Frida监听 & WT-JS工具还原(一)
  • • 2022最全最新前端面试题(附加解答)
  • • 前端面试八股文(详细版)—上
  • • Js运算符
  • • 【Vue】webpack的基本使用
  • • Pro3:js实现放大镜效果
  • • 【2022-11-26】JS逆向之北京百姓网
  • • 你评论,我赠书~【TFS-CLUB社区 第9期赠
  • • App逆向案例 X嘟牛 - Frida监听 &
  • • js中的正则表达式入门
  • • JavaScript箭头函数中的this详解
HTMLreactjsCSSNode.jsangulartypescriptvue.jsreact-natispringkotlinAPIseleniumtensorflowbashangularJSexpressxcodematplotlibflaskHibernatedictionaryrailscocoswebnpmreact-hookmongoosegoogle-appformswpfRestwebpackunit-testihttpclassfileNext.jsJsHTML5bootstrap-
  • 友情链接:
  • 菜鸟教程
  • 前端之家
  • 编程小课
  • 小编
  • -
  • 我要投稿
  • -
  • 广告合作
  • -
  • 联系我们
  • -
  • 免责声明
  • -
  • 网站地图
版权所有 © 2018 小编 闽ICP备13020303号-8
微信公众号搜索 “ 程序精选 ” ,选择关注!
微信公众号搜"程序精选"关注
微信扫一扫可直接关注哦!
name price number totalPrice option

angularjs – Angular bootstrap typeahead不能使用Angular 1.3.0

angularjs – Angular bootstrap typeahead不能使用Angular 1.3.0

我创建了一个小的plunker来表明这不起作用.谁能帮助我如何使用1.3.0 angularJS /提供备用解决方案的typeahead.我们正在使用angular-bootstrap 0.11.0和最新版本的bootstrap.我们的代码严重依赖于1.3.0中引入的ng-messages

Here is the plunker link

你可以清楚地看到,点击事件,向上箭头和向下箭头不起作用.添加一些代码让SO开心.

总结

以上是小编为你收集整理的angularjs – Angular bootstrap typeahead不能使用Angular 1.3.0全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

angularjs – Angular JS UI Bootstrap选项卡(ui.bootstrap.tabs)导致页面滚动/跳转选择

angularjs – Angular JS UI Bootstrap选项卡(ui.bootstrap.tabs)导致页面滚动/跳转选择

选择选项卡会导致页面随机滚动,例如选择选项卡可以将页面几乎一直滚动到顶部,然后我必须向下滚动才能看到选项卡的内容,如果我选择另一个选项卡页面再次滚动.

标签的内容大小可变,有些元素比其他元素多,所以它们自然具有不同的高度,但我不确定这是否是随机页面滚动的原因.

我尝试了一些jquery来禁用链接默认操作而没有运气.

$(function () {
   $('body').on('click','a[ng-click="select()"]',function (event) {
      event.preventDefault();
   });
});

另一个丑陋的解决方案是我将tabset包装在div中并在div上设置一个高度

<divid="profile-nav-tabs">
        <tabset justified="true">
            <tab  heading="{{::strings.profile}}">
                <br />
                <div  ng-include="'tab-profile.PHP'"></div>
            </tab>
            .... more tabs
       </tabset>
</div>
我遇到了同样的问题.在跟踪代码之后,我认为这是tabset指令的错误.

解决方案是(一步一步):

>修改tabset.html,删除[ng-class =“{active:tab.active}”]
>修改[tab]指令的范围.$watch(‘active’)的处理程序.
>使用angular.element的addClass和removeClass函数添加/删除活动类.

link: function(scope,elm,attrs,tabsetCtrl,transclude) {
scope.$watch('active',function(active) {
    /*if (active) {
      tabsetCtrl.select(scope);
    }*/
    var idx = tabsetCtrl.tabs.indexOf(scope);
    var elmPane = angular.element(elm[0]).parent().next().children()[idx]; //li->ul->div(tab-content)->div(tab-pane)
    if (active) {
        tabsetCtrl.select(scope);
        angular.element(elmPane).addClass('active');
    }
    else {
        angular.element(elmPane).removeClass('active');
    }
});

angularjs – angular.bootstrap启动后unbootstrap?

angularjs – angular.bootstrap启动后unbootstrap?

无法尝试重新编译角度应用程序.

调用angular.bootstrap后有没有办法解除引导?

一旦我在已经引导的情况下执行angular.bootstrap,就会导致错误

谢谢!

解决方法

看起来似乎并没有设计角度,我想不出你想要的任何好理由(但也许你这样做).那说,从 angular.js source code看
 看起来这种方法可行的唯一方法是删除最初从DOM引导的元素,然后重新添加它,然后再次尝试引导.

这是一个jsfiddle概念证明,它引导了一个超级简单的应用程序,然后在5秒后再次引导自己.在复杂的应用程序上做这样的事情我会非常犹豫,但似乎确实有效.

var bootstrapApp = function(appDiv) {
    var isSecondTime = false;
    if (appDiv) {
        document.body.removeChild(appDiv);
        isSecondTime = true;
    }
    appDiv = document.createElement('div');
    appDiv.id = "myApp";
    appDiv.innerHTML = (isSecondTime ? ' 2nd bootstrap': ' 1st bootstrap') + template.innerHTML;
    document.body.appendChild(appDiv);
    angular.bootstrap(angular.element(appDiv),['myApp']);

    return appDiv;
}

var createdAppDiv = bootstrapApp(null);

setTimeout(function() {
    console.log("try boostraping again");
    bootstrapApp(createdAppDiv);
},5000);

今天关于利用Angularjs和bootstrap实现购物车功能javascript购物车的分享就到这里,希望大家有所收获,若想了解更多关于angular.js实现购物车功能、angularjs – Angular bootstrap typeahead不能使用Angular 1.3.0、angularjs – Angular JS UI Bootstrap选项卡(ui.bootstrap.tabs)导致页面滚动/跳转选择、angularjs – angular.bootstrap启动后unbootstrap?等相关知识,可以在本站进行查询。

本文标签:

上一篇Node.js配合node-http-proxy解决本地开发ajax跨域问题(node.js解决跨域请求)

下一篇AngularJS实现一次监听多个值发生的变化(angular监听事件)