Avalonjs 实现简单购物车功能

这篇文章主要介绍了关于avalonjs 实现简单购物车功能,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

avalon是国内最强大的MVVM框架,最近小编在高购物车的项目,我们是用avalon来实现一些模块的,所以顺其自然的用avalon来实现购物车。接下来通过本文给大家分享Avalonjs 实现简单购物车功能的实例代码,需要的的朋友参考下

 先给大家简单介绍下avalon概念

avalon是国内最强大的MVVM框架,没有之一,虽然淘宝KISSY团队也搞了两个MVVM框架,但都无疾而终。其他的MVVM框架都没几个。也只有外国人与像我这样闲的架构师才有时间钻研这东西。我很早之前就预言,MVVM是前端的终极解决方案。我之前在盛大无线做盛大通行证就深有体会,一个业务逻辑对应十来个不同的界面,分层架构是必不可少的。因此双向绑定作为解药,结合很早就流行的MVC框架,衍生出MVVM这神器。

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

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

    1、页面的Html结构

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

 

登录后复制  全选      {{el.text}}    加  减  删除  

单价:{{el.price | currency}}

  

金额:{{el.num*el.price | currency}}

    

总金额:{{total | currency}}

 

     这里有全选、加减、删除几个功能事件,金额用了过滤器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

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

    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();});

登录后复制

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

nbsp;html>   购物车       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();    

登录后复制  全选      {{el.text}}    加  减  删除  

单价:{{el.price | currency}}

  

金额:{{el.num*el.price | currency}}

    

总金额:{{total | currency}}

 

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

以上就是Avalonjs 实现简单购物车功能的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2764273.html

(0)
上一篇 2025年3月8日 10:26:34
下一篇 2025年3月1日 20:33:46

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • JS实现动态给标签控件添加事件

    这篇文章主要介绍了js实现动态给标签控件添加事件的方法,结合实例形式分析了javascript简单实现动态添加事件的相关操作技巧,需要的朋友可以参考下 本文实例讲述了JS实现动态给标签控件添加事件的方法。分享给大家供大家参考,具体如下: n…

    编程技术 2025年3月8日
    000
  • JS简单实现浮动窗口

    这篇文章主要介绍了js简单实现浮动窗口效果,涉及javascript操作浮动窗口的创建、打开、关闭等相关操作技巧,需要的朋友可以参考下 本文实例讲述了JS简单实现浮动窗口效果。分享给大家供大家参考,具体如下: HTML部分: nbsp;ht…

    2025年3月8日
    200
  • js代码延迟一定时间后执行一个函数的实例

    这篇文章主要介绍了关于js代码延迟一定时间后执行一个函数的实例,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 实例如下:  setTimeout(funcName,500);    function funcName() {…

    编程技术 2025年3月8日
    200
  • 利用JS hash制作单页Web应用的方法详解

    这篇文章主要介绍了关于利用js hash制作单页web应用的方法详解,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 前言 本文主要给大家介绍了关于利用JS hash制作单页Web应用的相关内容,分享出来供大家参考学习,下面话…

    编程技术 2025年3月8日
    200
  • JS去掉字符串前后空格或去掉所有空格的用法

    这篇文章主要介绍了js去掉字符串前后空格或去掉所有空格的用法,需要的朋友可以参考下 1、  去掉字符串前后所有空格: 代码如下:    function Trim(str)   {     return str.replace(/(^s*)…

    编程技术 2025年3月8日
    200
  • js保留两位小数的方法

    本篇文章给大家总结了js保留两位小数的各种方法以及每种方法的实例代码分析,如果大家对此有需要,一起来学习下js保留两位小数的方法吧。 本文是小编针对js保留两位小数这个大家经常遇到的经典问题整理了在各种情况下的函数写法以及遇到问题的分析,以…

    编程技术 2025年3月8日
    200
  • 使用Vue.Js结合Jquery Ajax加载数据的两种方式

    本篇文章主要介绍了详解使用vue.js结合jquery ajax加载数据的两种方式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 整理文档,搜刮出一个使用Vue.Js结合Jquery Ajax加载数据的两种方式的代码,稍微整理精简一下做…

    2025年3月8日
    200
  • JS简单获取当前年月日星期的方法

    这篇文章主要介绍了js简单获取当前年月日星期的方法,结合完整实例形式分析了javascript基于自定义函数获取当前日期时间的方法,涉及javascript中date()类的使用与日期相关运算技巧,需要的朋友可以参考下 本文实例讲述了JS简…

    2025年3月8日
    200
  • JS中判断某个字符串是否包含另一个字符串的方法

    本文给大家带来js中判断某个字符串是否包含另一个字符串的五种方法,有string对象的方法,match() 方法,regexp对象的方法,test() 方法,exec() 方法,具体内容详情大家参考下本文 String对象的方法 方法一: …

    编程技术 2025年3月8日
    200
  • 关于Node.js时间循环的使用

    Node.js的使用性能较好,所以在使用中会经常见到,所以本文将会详细的讲解。 Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。 node.js 的每一个 api 都是异步的,并作为一个独立线程运行,使用…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论