HTML

<div ng-app="app">

    <div class="l-header">
<div class="l-cart">
<div class="l-cart-count" ng-click="showCart = !showCart">{{ calculateTotalProducts() }}</div>
<div class="l-cart-items" ng-show="showCart">
<div ng-show="cart.length">
<ul>
<li ng-repeat="item in cart">
<div class="l-cart-item-name">{{ item.product.name }}</div>
<div class="l-cart-item-quantity">
<input type="number" ng-model="item.quantity" ng-change="removeIfZero(item)" />
</div> <div class="l-cart-item-subtotal">{{ item.quantity * item.product.price | currency }}</div>
<div class="remove-item">
<img src="https://cdn3.iconfinder.com/data/icons/cleaning-icons/512/Trash_Can-512.png" ng-click="removeFromCart(item)">
</div>
</li>
</ul>
<div class="l-cart-total">total <b>{{ calculateTotalPrice() | currency }}</b></div>
</div>
<div class="l-cart-empty" ng-hide="cart.length">tu carrito está vacío</div>
</div>
</div>
</div> <ul class="l-stock">
<li class="l-product" ng-repeat="product in stock" ng-click="addToCart(product)" ng-class="{'is-on-cart': isProductOnCart(product)}">
<div class="l-product-name">{{ product.name }}</div>
<div class="l-product-price">{{ product.price | currency }}</div>
</li>
</ul> </div>

CSS:

body
color #333
padding 60px 10px 10px 10px
font-family Arial, Helvetica, sans-serif
user-select none .is-red
color red !important .l-header
display flex
justify-content flex-end
align-items center
position fixed
top 0
right 0
left 0
height 30px
padding 10px
background-color #2c3e50 .l-cart
position relative .l-cart-count
font-size 12px
font-weight 700
width 30px
line-height 30px
text-align center
color #ecf0f1
background-color #27ae60
border-radius 50%
cursor pointer .l-cart-items
position absolute
top 100%
right 0
width 270px
margin 10px -10px 0 0
padding 10px
font-size 12px
background-color #ecf0f1 &:before
content ""
position absolute
bottom 100%
right 15px
margin 0 0 -2px 0
border 10px solid transparent
border-bottom-color #ecf0f1 li
display flex
align-items center
padding-bottom 10px
margin-bottom 10px .l-cart-item-name
flex 1
overflow hidden
white-space nowrap
text-overflow ellipsis .l-cart-item-quantity
width 30px
margin 0 10px input
display block
border none
padding 5px
margin 0
width 100%
text-align right
appearance none &:focus
outline none
background-color #ffc &::-webkit-outer-spin-button,
&::-webkit-inner-spin-button
-webkit-appearance none
margin 0 .l-cart-item-subtotal
color #000
width 70px
text-align right .remove-item img
width:30px
height:30px
margin 0 10px
text-align center .l-cart-total
margin-top 10
padding-top 10px
text-align right
border-top 1px solid #bdc3c7 b
font-weight 700
font-size 1.4em .l-cart-empty
text-align center
font-size 1.4em
color #95a5a6 .l-stock & > li
float left
margin 0 10px 10px 0 &:after
content ""
clear both .l-product
display flex
color #fff
cursor pointer & > div
padding 10px .l-product-name
background-color #2980b9 .l-product-price
background-color #3498db .is-on-cart .l-product-name
background-color #27ae60 .l-product-price
background-color #2ecc71

JS

/**
* Esta función genera productos aleatoriamente
* (http://marak.com/faker.js/)
**/
function fetchStock () { var i = 0,
stock = [],
total = faker.random.number({min: 10, max: 30}); for (i = 0; i < total; i++) { stock.push({
name : faker.commerce.productName(),
price: faker.random.number({min: 1, max: 500})
});
} return stock;
}; /**
* Aquí empieza nuestro código Angular...
**/ var app = angular.module('app', []); app.run(function ($rootScope) { var cart = [],
stock = fetchStock(); var addToCart = function (product) { var item = cart.find(function (item) { return item.product === product;
}); if (item) { item.quantity++; } else { cart.push({
product : product,
quantity: 1
});
}
}; var removeFromCart = function (item) { var index = cart.indexOf(item); cart.splice(index, 1);
}; var removeIfZero = function (item) { if (item.quantity < 1) { removeFromCart(item);
}
}; var calculateTotalPrice = function () { return cart.reduce(function (sum, item) { return sum + item.quantity * item.product.price; }, 0);
}; var calculateTotalProducts = function () { return cart.reduce(function (sum, item) { return sum + item.quantity; }, 0);
}; var isProductOnCart = function (product) { return cart.some(function (item) { return item.product === product;
});
}; angular.extend($rootScope, {
stock: stock,
cart: cart,
addToCart: addToCart,
removeFromCart: removeFromCart,
removeIfZero: removeIfZero,
calculateTotalPrice: calculateTotalPrice,
calculateTotalProducts: calculateTotalProducts,
isProductOnCart: isProductOnCart
});
});

IONIC之简易购物车的更多相关文章

  1. Session机制二(简易购物车案例)

    一:案例一(简易购物车) 1.目录结构 2.step1.jsp <%@ page language="java" contentType="text/html; c ...

  2. javaweb练手项目jsp+servlet简易购物车系统

    简易购物车项目 这是一个用intellij IDEA做的简易的javaweb项目,开发环境使用的jdk1.8和tomcat8以及mysql数据库. 1.项目开发准备: 创建github仓库 项目框架搭 ...

  3. angular初始用——简易购物车

    <html> <head> <meta charset="utf-8"> <script src="js/angular.js& ...

  4. Java servlet 实现的简易购物车

    首页 2.购买页 3.购物车页 1. 首页代码 发送一个post请求 <!DOCTYPE html><html lang="en"><head> ...

  5. [ Python -1 ] 简易购物车程序

    练习: 1. 要求用户输入总资产,例如:2000 2. 显示商品列表,让用户根据序号选择商品,加入购物车 3. 购买,如果商品总额大于总资产,提示账户余额不足,否则,购买成功. goods = [{' ...

  6. ~~小练习:python的简易购物车~~

    进击のpython 1,用户先给自己的账户充钱:比如先充3000元. 2,有如下的一个格式: goods = [{"name": "电脑", "pri ...

  7. HttpSession之简易购物车

    创建一个简单的购物车模型,由三个 jsp 和两个 Servlet 组成: step1.jsp <%@ page language="java" contentType=&qu ...

  8. Newbe.Claptrap 框架入门,第一步 —— 创建项目,实现简易购物车

    让我们来实现一个简单的 “电商购物车” 需求来了解一下如何使用 Newbe.Claptrap 进行开发. 业务需求 实现一个简单的 “电商购物车” 需求,这里实现几个简单的业务: 获取当前购物车中的商 ...

  9. 简易购物车 --day2

    代码段 f =float(input('输入你的工资')) goods=['1.apple','2.mac','3.ph','4.python','5.php'] price=[35,26.5,14, ...

随机推荐

  1. 非接触式电子音乐控制器CHIMAERA

    本篇文章,我将介绍个有意思的设备. 她就是Chimaera,一个基于电磁场效应的非接触式电子音乐控制器. <弹奏Chimaera的声音> 霍尔效应传感器阵列及其周围部件组成了一个连续的2D ...

  2. 1001. 杀死吸引力(3n+1)猜想 (15)(ZJUPAT 数学)

    主题链接:http://pat.zju.edu.cn/contests/pat-b-practise/1001 卡拉兹(Callatz)猜想: 对不论什么一个自然数n,假设它是偶数,那么把它砍掉一半. ...

  3. 利用MARQUEE实现正在处理效果

    ASP.NET服务器端事件利用MARQUEE实现正在处理效果   前言:ASP.NET同仁们应该都遇到过当触发一个比较耗时的服务器端事件时,页面会处在一个等待的状态(即假死状态),用户体验非常不好,很 ...

  4. VIJOS1107 求树的最长链

    vijos1107环游大同80天 学习了一下求树的最长链的方法 最简单的思路就是两次dfs 两次dfs分别有什么用呢? 第一次dfs,求出某个任意的点能到达的最远的点 第二次dfs,从所搜到的最远的点 ...

  5. D10

    =-=今天被dev-c++坑到死..简直 晚上准备怒装liunx.. T1:数论 一开始碰到的是T1的运算符优先问题吧..maybe..但是我加上括号了还是WA啊..后面把式子拆开写才A了..次奥 附 ...

  6. Lazy<T>在Entity Framework中的性能优化实践

    Lazy<T>在Entity Framework中的性能优化实践(附源码) 2013-10-27 18:12 by JustRun, 328 阅读, 4 评论, 收藏, 编辑 在使用EF的 ...

  7. Android Recovery模式学习体会

        最近在学习Android的Recovery模式,感觉它和Windows的安全模式很相似.两者的工作原理都是只加载少量的系统组件(内核是必须的),使系统运行在最小模式,这样就可以在不影响当前系统 ...

  8. 揭开redis神秘面纱

    一直听别人说NoSQL,以前一直不明白,这到底是什么东西,今天听过我们涛哥的讲解,略有小感,特此小记. NoSQL(NoSQL = Not Only SQL),意为反SQL运动,是一项全新的数据库革命 ...

  9. springMVC3学习(三)--handlerMapping和handlerAdapter

    基本结构和 springMVC3学习(一)--框架搭建 差不多,这里不再用Annotation注解的方式 以下只说明需要修改的部分: 1.在Spring配置文件中配置HandlerMapping.Ha ...

  10. (Java 多线程系列)Java 线程池(Executor)

    线程池简介 线程池是指管理同一组同构工作线程的资源池,线程池是与工作队列(Work Queue)密切相关的,其中在工作队列中保存了所有等待执行的任务.工作线程(Worker Thread)的任务很简单 ...