因为最近有在做购物车,然后我们是用avalon来实现一些模块的,所以顺其自然的用avalon来实现购物车,目前发现avalon还是比较强大的,大大的节约了代码量。

购物车一般具备的功能是加减数量、选择商品、删除商品和计算金额,因为avalon具有双向绑定功能,所以杜绝了dom的操作,只需要完成功能的逻辑即可,可以分下面几个步骤实现。

  runjs: http://runjs.cn/detail/1dnkgxom

1、页面的Html结构

这里不考虑好的效果,所以直接用最简单的html来实现了,主要包含控制器,列表循环,金额显示,简单代码结构如下

<body ms-controller="test">
<ul ms-visible="arr.length">
<li><input type="checkbox" ms-click="checkAll" ms-duplex-checked="checkAllbool"/>全选</li>
<li ms-repeat="arr" >
<input type="checkbox" ms-attr-value="el.id" ms-duplex="selected" />
{{el.text}}
<input type="text" name="" ms-attr-value="el.num" ms-on-input="changeNum(el)">
<a href="javascript:;" ms-click="plus(el)">加</a>
<a href="javascript:;" ms-click="minus(el)">减</a>
<a href="javascript:;" ms-click="del(el)">删除</a>
<p>单价:{{el.price | currency}}</p>
<p>金额:{{el.num*el.price | currency}}</p>
</li>
</ul>
<p>总金额:{{total | currency}}</p>
</body>

这里有全选、加减、删除几个功能事件,金额用了过滤器currency。

2、引入avalon.js,定义模型

引入js是必须的,那么引入avalon.js后可以定义了

var vm = avalon.define({
$id: "test"
});

这样就定义了一个简单的模型,$id传入的是控制器的值,本文例子的控制器是写在body,如果不理解可以去看看官网。

3、定义购物车里面的商品

实际项目中,这个肯定是通过后台获取到的,这里为了演示就直接定义了,从第一点的html结构可以看出来,这里购物车的商品用的是arr,所以接着定义的就是arr,可以这样定义

arr : [
{
id:1,
num:1,
price:45.5,
text:'商品1'
},
{
id:2,
num:1,
price:8.8,
text:'商品2'
}]

这里就定义两个用来测试,那么还需要一个值来保存选中的商品id,这里给模型增加一个selected属性,类型为数组

selected:[]

4、定义全选的模型和方法

购物车里面一般都有全选的功能的,只是表现的形式不一样,那么可以这么定义

checkAllbool : false,
checkAll : function() {
if (this.checked) {
var _arr = [];
avalon.each(vm.arr,function(index,item){
_arr[index] = item.id+'';
});
vm.selected = _arr;
} else {
vm.selected=[];
}
}

通过checkAllbool属性来实现和判断是否选中“全选”,通过checkAll来实现选中全部或者取消选中全部,其实就是修改模型里面的selected属性,如果selected为空数组则没有一个是选中的,如果那个需要选中只需要把对应的值放到selected数组中即可,因为在html中checkbox使用 ms-duplex 进行绑定的,而绑定的是 selected属性。

4、定义加、减、删除的方法

加减主要是数量上的变化,而删除则是需要把该商品直接从arr(前面定义的属性)中删除

plus: function(el){
el.num++;
vm.cal();
},
minus: function(el){
if(el.num>1){
el.num--;
vm.cal();
}
},
del: function(el){
vm.arr.remove(el);
},
changeNum: function(el){
var _value = this.value,
_reg = /^[1-9]\d?$/
;
if(!_reg.test(_value)){
this.value = 1;
el.num = 1;
}else{
el.num = _value;
} vm.cal();
}

这里还有一个是当输入框改变时执行的方法,这里通过出入对象来进行操作,可以看看第一步中的html代码,就明白了,无论是改变还是加减都最后要执行 vm.cal,vm.cal是计算总金额的,将在下面讲解。

加减的方法都很简单主要是修改num属性即可,changeNum则增加了正则判断,判断输入的是否为数字。

5、定义计算总金额

计算总金额的方法很简单,就是把所有选中的商品的数量乘以单价再加起来,但是这里面涉及到另一个方法,那就是通过商品的id来找出对应的商品,这样才能计算该商品的金额。

total:0,
cal: function(){
var _arr = this.arr,
_selected = this.selected,
i = 0,
_obj = '',
_prcie = 0
;
if(_selected.length){
for(;i<_selected.length;i++){
_obj = this.findById(_selected[i]) ||{};
if(_obj.price && _obj.num){
_prcie = _prcie + _obj.price * _obj.num;
}
}
} this.total = _prcie; },
findById: function(id){
if(!id) return '';
var i=0,
_arr = this.arr,
_obj = '',
_id = parseInt(id,10)
; for(;i<_arr.length;i++){
if(_arr[i].id === _id){
_obj = _arr[i];
}
} return _obj;
}

这里面主要用的是循环,找到商品的对象然后计算商品的金额再相加,代码略长。

6、监听属性

需要监听两个属性,那就是 selected 和 arr,监听 selected是为了随时了解商品有没有全选中,主要通过监听Length。监听arr是判断商品有没有被删除,如果arr的length改变,则表示商品有被删除,需要重新计算总金额。

vm.selected.$watch("length", function(n) {
vm.checkAllbool = n === vm.arr.size()
vm.cal();
});
vm.arr.$watch("length", function(n) {
vm.cal();
});

通过上面的步骤分析,可以了解了大概的实现流程,下面是完整的代码。

<!DOCTYPE html>
<html>
<head>
<title>购物车</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<script src="../avalon.js" ></script>
<script>
var vm = avalon.define({
$id: "test",
arr : [
{
id:1,
num:1,
price:45.5,
text:'商品1'
},
{
id:2,
num:1,
price:8.8,
text:'商品2'
}
],
selected : ["1"],
checkAllbool : false,
checkAll : function() {
if (this.checked) {
var _arr = [];
avalon.each(vm.arr,function(index,item){
_arr[index] = item.id+'';
});
vm.selected = _arr;
} else {
vm.selected=[];
}
},
plus: function(el){
el.num++;
vm.cal();
},
minus: function(el){
if(el.num>1){
el.num--;
vm.cal();
}
},
del: function(el){
vm.arr.remove(el);
},
changeNum: function(el){
var _value = this.value,
_reg = /^[1-9]\d?$/
;
if(!_reg.test(_value)){
this.value = 1;
el.num = 1;
}else{
el.num = _value;
} vm.cal();
},
total:0,
cal: function(){
var _arr = this.arr,
_selected = this.selected,
i = 0,
_obj = '',
_prcie = 0
;
if(_selected.length){
for(;i<_selected.length;i++){
_obj = this.findById(_selected[i]) ||{}; if(_obj.price && _obj.num){
_prcie = _prcie + _obj.price * _obj.num;
}
}
} this.total = _prcie; },
findById: function(id){
if(!id) return '';
var i=0,
_arr = this.arr,
_obj = '',
_id = parseInt(id,10)
; for(;i<_arr.length;i++){
if(_arr[i].id === _id){
_obj = _arr[i];
}
} return _obj;
}
});
vm.selected.$watch("length", function(n) {
vm.checkAllbool = n === vm.arr.size()
vm.cal();
});
vm.arr.$watch("length", function(n) {
vm.cal();
});
vm.cal();
</script>
</head>
<body ms-controller="test">
<ul ms-visible="arr.length">
<li><input type="checkbox" ms-click="checkAll" ms-duplex-checked="checkAllbool"/>全选</li>
<li ms-repeat="arr" >
<input type="checkbox" ms-attr-value="el.id" ms-duplex="selected" />
{{el.text}}
<input type="text" name="" ms-attr-value="el.num" ms-on-input="changeNum(el)">
<a href="javascript:;" ms-click="plus(el)">加</a>
<a href="javascript:;" ms-click="minus(el)">减</a>
<a href="javascript:;" ms-click="del(el)">删除</a>
<p>单价:{{el.price | currency}}</p>
<p>金额:{{el.num*el.price | currency}}</p>
</li>
</ul>
<p>总金额:{{total | currency}}</p>
</body>
</html>

用avalon时间还不久,一步步来,希望能更深入了解mvvm框架,在后面的日子里应用更多的场景。

本文同时发布在我的个人博客 http://www.subying.com/archives/131.html

avalonjs 实现简单购物车的更多相关文章

  1. 简单购物车程序(Python)

    #简单购物车程序:money_all=0tag=Trueshop_car=[]shop_info={'apple':10,'tesla':100000,'mac':3000,'lenovo':3000 ...

  2. python实现简单购物车系统(练习)

    #!Anaconda/anaconda/python #coding: utf-8 #列表练习,实现简单购物车系统 product_lists = [('iphone',5000), ('comput ...

  3. Python实例---简单购物车Demo

    简单购物车Demo # version: python3.2.5 # author: 'FTL1012' # time: 2017/12/7 09:16 product_list = ( ['Java ...

  4. Session小案例-----简单购物车的使用

    Session小案例-----简单购物车的使用 同上篇一样,这里的处理请求和页面显示相同用的都是servlet. 功能实现例如以下: 1,显示站点的全部商品 2.用户点击购买后,可以记住用户选择的商品 ...

  5. 用Python实现简单购物车

    作业二:简单购物车# 实现打印商品详细信息,用户输入商品名和购买个数,则将商品名,价格,购买个数加入购物列表,# 如果输入为空或其他非法输入则要求用户重新输入 shopping_list = [] w ...

  6. java:Session(概述,三层架构实例(实现接口封装JDBC),Session实现简单购物车实例)

    1.Session概述: Session:在计算机中,尤其是在网络应用中,称为“会话控制”.Session 对象存储特定用户会话所需的属性及配置信息.这样,当用户在应用程序的 Web 页之间跳转时,存 ...

  7. AngularJS 实现简单购物车

    使用AngularJS实现一个简单的购物车,主要感受强大的双向绑定和只关注对象不关注界面特性. 先看看界面: 点击+-操作和删除: 这些全部只需要操作数据源就行,不需要关注界面. 实现过程: 一.使用 ...

  8. php 实现简单购物车

    今天在练习购物车以及提交订单,写的有点头晕,顺便也整理一下,这个购物车相对来说比较简单,用于短暂存储,并没有存储到数据库, 购物车对于爱网购的人来说简直是熟悉的不能再熟悉了,在写购物车之前,我们首先要 ...

  9. (Python基础)简单购物车代码

    以下是最简单,最基础的购物车代码,一起学习,一起参考.product_list = [ ('Iphone',5800), ('Mac Pro',15800), ('car',580000), ('co ...

随机推荐

  1. iOS-IAP内购的那些事(iOS内购漏单的问题)

    前言 说起内购,其实挺令开发者厌烦的,原因呢,先不说漏单的问题,首先苹果要扣除30%的销售额哦,可恨不?(我觉得可恨),有些想办法先隐藏掉第三方支付(支付宝.微信等),等项目上线了,再跳过内购使用第三 ...

  2. 阿里云centos 开启ipv6

    参考网址 https://blog.chenjia.me/articles/160301-134110.html?spm=5176.bbsr285557.0.0.g1Oemn 阿里云限制了ipv6的功 ...

  3. K-means算法的原理、优缺点及改进(转)

    文章内容转载自:http://blog.csdn.net/sinat_35512245/article/details/55051306                                ...

  4. (转)深入浅出 RPC - 深入篇

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/mindfloating/article/details/39474123 <深入篇>我们 ...

  5. Feign status 400 reading 问题分析

    背景:项目使用的是微服务架构,采用springboot来开发,所有的服务都是基于内嵌tomcat来运行 问题:项目部署到测试环境之后,偶尔在后台日志会看到这样的日志:Feign status 400 ...

  6. RocketMq(二)消息中间件源码下载、模块分化以及集群模式的认知

    1.通过IDEA使用git下载源码 到RocketMq官网指定的GitHub路径获取下载链接 https://github.com/apache/rocketmq 获取下载源码路径 使用IDEA自带的 ...

  7. ListView中的TextView实现跑马灯效果

    1.TextView首先添加android:ellipsize="marquee"   android:marqueeRepeatLimit="marquee_forev ...

  8. Android:异步处理之Handler、Looper、MessageQueue之间的恩怨(三)

    前言 如果你在阅读本文之前,你不知道Handler在Android中为何物,我建议你先看看本系列的第一篇博文<Android:异步处理之Handler+Thread的应用(一)>:我们都知 ...

  9. 读书笔记(02) - 可维护性 - JavaScript高级程序设计

    编写可维护性代码 可维护的代码遵循原则: 可理解性 (方便他人理解) 直观性 (一眼明了) 可适应性 (数据变化无需重写方法) 可扩展性 (应对未来需求扩展,要求较高) 可调试性 (错误处理方便定位) ...

  10. Silverlight中使用MVVM(2)-(提高)

    在第一篇文章中的示例中,我们已经简单的了解了应用MVVM模式的流程,我的本意是你已经了解了一点MVVM的概念,然后又没有一个较好的例子学习,可以跟着我一起学习MVVM模式,所以这个部分,都是没有理论知 ...