亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網站 > WEB開發 > 正文

avalonjs 實現簡單購物車

2024-04-27 15:11:19
字體:
來源:轉載
供稿:網友

    因為最近有在做購物車,然后我們是用avalon來實現一些模塊的,所以順其自然的用avalon來實現購物車,目前發現avalon還是比較強大的,大大的節約了代碼量。

    購物車一般具備的功能是加減數量、選擇商品、刪除商品和計算金額,因為avalon具有雙向綁定功能,所以杜絕了dom的操作,只需要完成功能的邏輯即可,可以分下面幾個步驟實現。

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

    1、頁面的Html結構

    這里不考慮好的效果,所以直接用最簡單的html來實現了,主要包含控制器,列表循環,金額顯示,簡單代碼結構如下

12345678910111213141516<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后可以定義了

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

    這樣就定義了一個簡單的模型,$id傳入的是控制器的值,本文例子的控制器是寫在body,如果不理解可以去看看官網。

    3、定義購物車里面的商品

    實際項目中,這個肯定是通過后臺獲取到的,這里為了演示就直接定義了,從第一點的html結構可以看出來,這里購物車的商品用的是arr,所以接著定義的就是arr,可以這樣定義

12345678910111213arr : [  {    id:1,    num:1,    price:45.5,    text:'商品1'  },  {    id:2,    num:1,    price:8.8,    text:'商品2'  }<span style="font-size: 9pt; line-height: 1.5;">]</span>

    這里就定義兩個用來測試,那么還需要一個值來保存選中的商品id,這里給模型增加一個selected屬性,類型為數組

1selected:[]

    4、定義全選的模型和方法

    購物車里面一般都有全選的功能的,只是表現的形式不一樣,那么可以這么定義

123456789101112checkAllbool : 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(前面定義的屬性)中刪除

1234567891011121314151617181920212223242526plus: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來找出對應的商品,這樣才能計算該商品的金額。

123456789101112131415161718192021222324252627282930313233343536total: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改變,則表示商品有被刪除,需要重新計算總金額。

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

 

    通過上面的步驟分析,可以了解了大概的實現流程,下面是完整的代碼。

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128<!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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品丝袜一区二区三区| 亚洲男女自偷自拍图片另类| xxxx欧美18另类的高清| 中文欧美在线视频| 91精品国产综合久久香蕉最新版| 亚洲最新av在线| 欧美性猛交视频| 日韩在线观看av| 色噜噜狠狠狠综合曰曰曰| 亚洲欧美综合区自拍另类| 欧美国产日韩免费| 久久成人精品一区二区三区| 亚洲精品美女在线| 欧美午夜精品久久久久久人妖| 国产亚洲精品成人av久久ww| 91色精品视频在线| 日本成人黄色片| 九九热在线精品视频| 日韩欧美在线观看视频| 久久九九国产精品怡红院| 亚洲一区二区三区sesese| 中文字幕精品影院| 亚洲在线视频福利| 26uuu另类亚洲欧美日本老年| 亚洲欧美日韩中文视频| 人妖精品videosex性欧美| 奇门遁甲1982国语版免费观看高清| 欧美午夜电影在线| 欧美日韩在线另类| 综合欧美国产视频二区| 久久久久久久久爱| 国产精品18久久久久久麻辣| 国产精品你懂得| 理论片在线不卡免费观看| 亚洲精品视频二区| 国产日韩在线观看av| 久久久女人电视剧免费播放下载| 欧美成人午夜免费视在线看片| 国产精品女人久久久久久| 97精品视频在线| 91网在线免费观看| 亚洲精品欧美一区二区三区| 久久人人爽人人爽爽久久| 亚洲aa在线观看| 成人黄色在线观看| 免费av一区二区| 中文字幕少妇一区二区三区| 亚洲国产精品va在线看黑人动漫| 91精品视频免费观看| 国产精品青草久久久久福利99| 2019最新中文字幕| 中文字幕亚洲自拍| 国产精品第一视频| 国内久久久精品| 91色琪琪电影亚洲精品久久| 亚洲精品电影在线观看| 成人在线观看视频网站| 久久精品成人一区二区三区| 亚洲欧美制服另类日韩| www.欧美三级电影.com| 亚洲在线观看视频| 66m—66摸成人免费视频| 久久久久亚洲精品成人网小说| 亚洲最大福利视频| 一本一本久久a久久精品牛牛影视| 国产精品久久久久9999| 91a在线视频| 亚洲欧美制服第一页| 97精品伊人久久久大香线蕉| 日本一欧美一欧美一亚洲视频| 欧美超级免费视 在线| 国产精品电影在线观看| 日韩欧美a级成人黄色| 国产精品女主播视频| 国产精品国产自产拍高清av水多| 精品精品国产国产自在线| 日韩h在线观看| 日韩精品免费综合视频在线播放| 成人激情在线播放| 亚洲一区中文字幕| 精品中文字幕在线| 性欧美亚洲xxxx乳在线观看| 97视频网站入口| 高跟丝袜一区二区三区| 久久久亚洲精选| 国产精品夜色7777狼人| 一本色道久久88综合亚洲精品ⅰ| 91高清免费在线观看| 欧美精品久久久久a| 91在线视频导航| 亚洲欧美中文字幕在线一区| 萌白酱国产一区二区| 精品久久久久人成| 国产精自产拍久久久久久| 欧美大尺度电影在线观看| 国产精品美女999| 欧美性极品xxxx娇小| 日韩av电影在线播放| 日韩av电影院| 日韩av在线看| 日韩美女毛茸茸| 欧美视频专区一二在线观看| 亚洲国产美女精品久久久久∴| 欧美性高潮床叫视频| 国产日韩综合一区二区性色av| 亚洲韩国欧洲国产日产av| 亚洲一区制服诱惑| 欧美日韩国产色| 欧美猛交ⅹxxx乱大交视频| 久久久国产精品视频| 国产精品www网站| 91精品国产综合久久香蕉最新版| 日韩欧亚中文在线| 成人福利视频在线观看| 亚洲欧美国产制服动漫| 日本一区二三区好的精华液| 亚洲国产精品成人av| 欧美区在线播放| 亚洲精品福利视频| 国产精品视频中文字幕91| 日产日韩在线亚洲欧美| 亚洲综合在线播放| 欧美日韩aaaa| 777国产偷窥盗摄精品视频| 国产狼人综合免费视频| 亚洲精品黄网在线观看| 中文字幕亚洲图片| 成人久久久久久久| 在线观看国产精品日韩av| 国产精品久久久久91| 午夜免费日韩视频| 国产精品久久久久久久久久新婚| 久久久久久久国产精品| 国产成人aa精品一区在线播放| 91视频免费在线| 亚洲国产精品电影在线观看| 日韩激情片免费| 精品成人久久av| 97香蕉超级碰碰久久免费软件| 欧美日韩国产二区| 欧美激情亚洲另类| 91亚洲精品一区二区| 国产精品福利在线观看| 欧美大尺度激情区在线播放| 96sao精品视频在线观看| 久久免费国产精品1| 国产一区二区黄| 深夜福利国产精品| 亚洲第一网中文字幕| 亚洲缚视频在线观看| 一区二区成人av| 欧美中文字幕精品| 日本韩国在线不卡| 亚洲女人天堂av| 在线亚洲国产精品网| 国产免费一区二区三区在线观看| 亚洲精品白浆高清久久久久久| 欧美精品在线观看| 91av免费观看91av精品在线| 欧美日韩福利在线观看| 亚洲美女喷白浆| 日韩三级影视基地| 一区二区三区亚洲| 2020国产精品视频|