日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

javascript的MVC三层架构(案例之分页插件)

發布時間:2025/3/20 javascript 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 javascript的MVC三层架构(案例之分页插件) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

javascript的MVC三層架構(案例之分頁插件)

作者:田想兵 博客地址:http://www.cnblogs.com/tianxiangbing

最近很少寫博文,一是比較忙,二是沒啥心情,好,言歸正傳,今天的主題是MVC版的javascript結構,做程序的,可能對MVC會有較深刻的印象,就是Model-View-Control,中文的意思就是模型-視圖-控制器,這好像已經是一個很成熟的結構了,后來又有些在它基礎上的拓展,有興趣的可以擺渡一下。所以它基本上適應任何情況下的編程,今天我們就要用它來實現js版的一個分頁控件。

首先,我們先明確每一層是做什么的:

View也就是視圖層,在這里面我們會去初始化一些html元素;

Model模型層,我一直認為這一層存在的意義不大,因為通常我們new一個js對象的時候,都會初始化它的一些變量,很少會去單獨寫個方法去設置它,所以就把Model改成發送ajax請求了;

Control控制器,這里就是一些業務邏輯了,這里我們可以再分出一個事件層來;

Event事件層,處理html事件。

中途停了一天,接著寫,不知道為啥,最近一直都沒有辦法集中精力,可能是因為兒童節吧,今天還要加班, 可悲的碼農啊,題外話不說了,繼續碼字。

現在我們來分析下需求,分頁控件,無非就是對數據的一個分組顯示,所以它一定會有pagesize(每頁條數)和count(總條數) 這兩個屬性,當然也有人喜歡把所有數據返回過來給前端來分頁,不過分頁的目的之一,就是為了減輕數據量,一次批量返回也不是不行,具體情況具體分析吧!有了count和pagesize后,我們就可以算出總頁碼數了。

parseInt(?count?%?pageSize?>0??count?/?pageSize+1:count/pagesize)

這個很簡單,就是整除有余的話就多一頁,否則取整數部分。

我們先看下效果圖,不然的話,腦子里沒有一個結構,也是無法下手的。請觀看下圖:

?

?

?

接著該MVC三層結構出場了,我們先在view(視圖層)初始化一些必要的HTML元素:

view:function(method,args){????????
????????var?_self=this;????
????????var?_class={
????????????page:function(args){
????????????????var?_html='\
????????????????????????<div?class="pager">\
????????????????????????????<a?class="firstPage"?href="javascript:void(0);">首頁</a>\
????????????????????????????<a?class="prePage"?href="javascript:void(0);">上一頁</a>\
????????????????????????????<span?class="inputPage">第<input?type="text"?value="'+?_self.currentIndex?+'"?class="txt_curIndex"?name="txt_curIndex"/>頁/<i>'+_self.sumPage+'</i>頁</span>\
????????????????????????????<a?class="nextPage"?href="javascript:void(0);">下一頁</a>\
????????????????????????????<a?class="lastPage"?href="javascript:void(0);">末頁</a>\
????????????????????????</div>\
????????????????????????????';
????????????????_self.content.html(_html);
????????????????_self.event("bind",args);
????????????}
????????};
????????return?_class[method](args);
????}

?在這里,我又調用了事件層,來給這些HTML元素綁定相應的事件,這里大概有五個事件,就是上一頁,下一頁,首頁,未頁,及跳轉。這些事件,其本質就是改變頁碼數,好,那我們就寫個請求頁碼數的方法:

model:function(method,args){
????????var?_self=this;
????????var?_class={
????????????go:function(args){
????????????????return?$.ajax({
????????????????????url:_self.ajaxUrl,
????????????????????dataType:"json",
????????????????????async:true,
????????????????????data:args[0],
????????????????????success:function(data){
????????????????????????args[1](data);
????????????????????????_self.cpu("change",data);
????????????????????},
????????????????????type:"GET",
????????????????????error:function(data){
???????????????????????? alert("json格式不正確")
????????????????????}
????????????????});
????????????}
????????};
????????return?_class[method](args);
????}

這是個ajax請求,放在model層下面,有兩個參數,一個是ajax需要傳的參數{page:1} args[0],另一個是外部的一個回調方法,用來格式化內容的,這個跟分頁控件沒有半毛錢關系,所以就當作回調。好,接著我們在控制器層里就調用這個方法就行了,剛才說到有五個事件,這樣就對應了五個控制器:

View Code cpu:function(method,args){
????????var?_self=this;
????????var?_class={
????????????change:function(data){
????????????????var?arr?=?data;
????????????????if?(data.count>0){
????????????????????_self.count=data.count;
????????????????????_self.sumPage=?parseInt(?_self.count?%?_self.pageSize?>0???_self.count?/?_self.pageSize+1?:?_self.count?/?_self.pageSize);
????????????????????_self.view("page");
????????????????}
????????????},????????????????
????????????jump:function(args){
????????????????var?input?=?parseInt($("[name='txt_curIndex']",_self.content).val());
????????????????if?(input>0?&&?input?<=?_self.sumPage){
????????????????????_self.currentIndex?=?input;
????????????????????_self.ajaxArgs.page?=?_self.currentIndex-1;
????????????????????_self.model("go",[_self.ajaxArgs,_self.returnFunc]);
????????????????}
????????????},
????????????prev:function(args){
????????????????if?(_self.currentIndex?>?1){
????????????????????_self.currentIndex--;
????????????????????$("[name='txt_curIndex']",_self.content).val(_self.currentIndex);
????????????????????_self.cpu("jump",args);
????????????????}
????????????},
????????????next:function(args){????????????????
????????????????if?(_self.currentIndex?<?_self.sumPage?-?1){
????????????????????_self.currentIndex++;
????????????????????$("[name='txt_curIndex']",_self.content).val(_self.currentIndex);
????????????????????_self.cpu("jump",args);
????????????????}
????????????},
????????????last:function(args){
????????????????_self.currentIndex?=?_self.sumPage;
????????????????$("[name='txt_curIndex']",_self.content).val(_self.currentIndex);
????????????????_self.cpu("jump",args);
????????????},
????????????first:function(args){
????????????????_self.currentIndex?=?1;
????????????????$("[name='txt_curIndex']",_self.content).val(_self.currentIndex);
????????????????_self.cpu("jump",args);
????????????}
????????};
????????return?_class[method](args);
????}
};

?數一數,是不是五個,我勒個去,作者數學不好,竟然是他妹的六個,竟然多了個change,好啦,把chage這個放model里去吧,他的作用就是計算一些變量的值。

最后事件層只需要調用Control控制層相對應的方法就行了:

event:function(method,args){
????????var?_self=this;
????????var?pager?=?$("div.pager",_self.content);
????????var?_class={
????????????bind:function(args){
????????????????$("[name='txt_curIndex']",_self.content).keydown(function(e){
????????????????????if?(e.keyCode==13){
????????????????????????_self.cpu("jump",args);
????????????????????}
????????????????});
????????????????$(".prePage",_self.content).click(function(){
????????????????????_self.cpu("prev",args);
????????????????});????
????????????????$(".nextPage",_self.content).click(function(){
????????????????????_self.cpu("next",args);
????????????????});
????????????????$(".lastPage",_self.content).click(function(){
????????????????????_self.cpu("last",args);
????????????????});
????????????????$(".firstPage",_self.content).click(function(){
????????????????????_self.cpu("first",args);
????????????????});
????????????}
????????};
????????return?_class[method](args);
????},

這樣是不是就完了呢,你猜?沒錯,恭喜你,猜對了,還沒有結束,因為我們還沒有看到入口,一般情況我們都喜歡定義一個名為init的方法來初始化,這次的情況也很一般,所以定義init吧:

init:function(ops){
????????var?_self?=?this;
????????_self.currentIndex?=?ops.currentIndex;
????????_self.ajaxArgs?=?$.extend(?ops.ajaxArgs,{page:this.currentIndex-1});
????????_self.model("go",[_self.ajaxArgs,_self.returnFunc]);
????},

整個分頁插件的代碼如下:

View Code function?Pager(ops){
????this.currentIndex?=?1;
????this.count?=?ops.count;
????this.pageSize?=?ops.pageSize||10;
????this.sumPage?=?1;
????this.content?=?ops.content;
????this.ajaxUrl?=?ops.url;
????this.returnFunc=ops.returnFunc||new?Function();
};
Pager.prototype={
????init:function(ops){
????????var?_self?=?this;
????????_self.currentIndex?=?ops.currentIndex;
????????_self.ajaxArgs?=?$.extend(?ops.ajaxArgs,{page:this.currentIndex-1});
????????_self.model("go",[_self.ajaxArgs,_self.returnFunc]);
????},
????view:function(method,args){????????
????????var?_self=this;????
????????var?_class={
????????????page:function(args){
????????????????var?_html='\
????????????????????????<div?class="pager">\
????????????????????????????<a?class="firstPage"?href="javascript:void(0);">首頁</a>\
????????????????????????????<a?class="prePage"?href="javascript:void(0);">上一頁</a>\
????????????????????????????<span?class="inputPage">第<input?type="text"?value="'+?_self.currentIndex?+'"?class="txt_curIndex"?name="txt_curIndex"/>頁/<i>'+_self.sumPage+'</i>頁</span>\
????????????????????????????<a?class="nextPage"?href="javascript:void(0);">下一頁</a>\
????????????????????????????<a?class="lastPage"?href="javascript:void(0);">末頁</a>\
????????????????????????</div>\
????????????????????????????';
????????????????_self.content.html(_html);
????????????????_self.event("bind",args);
????????????}
????????};
????????return?_class[method](args);
????},
????event:function(method,args){
????????var?_self=this;
????????var?pager?=?$("div.pager",_self.content);
????????var?_class={
????????????bind:function(args){
????????????????$("[name='txt_curIndex']",_self.content).keydown(function(e){
????????????????????if?(e.keyCode==13){
????????????????????????_self.cpu("jump",args);
????????????????????}
????????????????});
????????????????$(".prePage",_self.content).click(function(){
????????????????????_self.cpu("prev",args);
????????????????});????
????????????????$(".nextPage",_self.content).click(function(){
????????????????????_self.cpu("next",args);
????????????????});
????????????????$(".lastPage",_self.content).click(function(){
????????????????????_self.cpu("last",args);
????????????????});
????????????????$(".firstPage",_self.content).click(function(){
????????????????????_self.cpu("first",args);
????????????????});
????????????}
????????};
????????return?_class[method](args);
????},
????model:function(method,args){
????????var?_self=this;
????????var?_class={
????????????go:function(args){
????????????????return?$.ajax({
????????????????????url:_self.ajaxUrl,
????????????????????dataType:"json",
????????????????????async:true,
????????????????????data:args[0],
????????????????????success:function(data){
????????????????????????args[1](data);
????????????????????????_self.model("change",data);
????????????????????},
????????????????????type:"GET",
????????????????????error:function(data){
????????????????????console.dir(data)
?????????????????????????alert("json格式不正確")
????????????????????}
????????????????});
????????????},
????????????change:function(data){
????????????????var?arr?=?data;
????????????????if?(data.count>0){
????????????????????_self.count=data.count;
????????????????????_self.sumPage=?parseInt(?_self.count?%?_self.pageSize?>0???_self.count?/?_self.pageSize+1?:?_self.count?/?_self.pageSize);
????????????????????_self.view("page");
????????????????}
????????????}
????????};
????????return?_class[method](args);
????},
????cpu:function(method,args){
????????var?_self=this;
????????var?_class={????????????????
????????????jump:function(args){
????????????????var?input?=?parseInt($("[name='txt_curIndex']",_self.content).val());
????????????????if?(input>0?&&?input?<=?_self.sumPage){
????????????????????_self.currentIndex?=?input;
????????????????????_self.ajaxArgs.page?=?_self.currentIndex-1;
????????????????????_self.model("go",[_self.ajaxArgs,_self.returnFunc]);
????????????????}
????????????},
????????????prev:function(args){
????????????????if?(_self.currentIndex?>?1){
????????????????????_self.currentIndex--;
????????????????????$("[name='txt_curIndex']",_self.content).val(_self.currentIndex);
????????????????????_self.cpu("jump",args);
????????????????}
????????????},
????????????next:function(args){????????????????
????????????????if?(_self.currentIndex?<?_self.sumPage?-?1){
????????????????????_self.currentIndex++;
????????????????????$("[name='txt_curIndex']",_self.content).val(_self.currentIndex);
????????????????????_self.cpu("jump",args);
????????????????}
????????????},
????????????last:function(args){
????????????????_self.currentIndex?=?_self.sumPage;
????????????????$("[name='txt_curIndex']",_self.content).val(_self.currentIndex);
????????????????_self.cpu("jump",args);
????????????},
????????????first:function(args){
????????????????_self.currentIndex?=?1;
????????????????$("[name='txt_curIndex']",_self.content).val(_self.currentIndex);
????????????????_self.cpu("jump",args);
????????????}
????????};
????????return?_class[method](args);
????}
};

OK,最后我們回過頭來看下,這個結構的優劣點,優點了,就是更方便于擴展,可以無限制的往下加,層次分得較清明,劣點是,層次過深,效率會低一些,而且看著不爽,所以我給他定位為,管理系統業務邏輯較多時使用,一般的JS效果插件還是使用扁平結構的好。今天就寫到這吧,謝謝您的觀看,最后的臺詞是:如果你有任何的疑問都不要來問我,請反復閱讀本文。也可以加入我的QQ群與其他人討論,本文的DEMO會放在群共享里。我的群號有5678537,70210212,閉幕.

轉載于:https://www.cnblogs.com/tianxiangbing/archive/2012/06/02/js_mvc.html

總結

以上是生活随笔為你收集整理的javascript的MVC三层架构(案例之分页插件)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产内射合集颜射 | 影音先锋成人网 | 久久国产成人 | 国产二区av | 亚洲精品一 | 国模视频一区二区 | 少妇做爰免费视看片 | 制中文字幕音影 | 97国产成人无码精品久久久 | 色婷婷久久综合中文久久蜜桃av | 1024福利 | 谁有免费的黄色网址 | 国产小视频在线观看 | 婷婷的五月| 国产91在线免费 | 午夜小网站| 青青草一区二区三区 | 成年人网站免费视频 | 丰满人妻一区二区三区在线 | 激情综合五月天 | 日本一级黄 | 成年人久久 | 青娱乐超碰 | 欧美一区二区久久久 | ,国产精品国产三级国产 | 精品国内自产拍在线观看视频 | 欧美日本一道本 | 伊人欧美 | 欧美性受xxxx黑人 | 日韩在线免费视频观看 | 双性受孕h堵精大肚生子 | 国产欧美久久久精品免费 | 99热网站| 午夜久久久久 | 高清免费av | www.色啪啪.com | 看av网 | 手机av免费看 | 黑人巨茎大战欧美白妇 | 国产精品久久久久9999爆乳 | 天天干中文字幕 | 国产精品国产三级国产播12软件 | 久久国产精彩视频 | 色翁荡息又大又硬又粗又爽 | 日本性网站 | 免费在线观看的黄色网址 | 欧美精品v| 99久久久无码国产精品衣服 | 日韩精品1区| 老色批影视 | 久久欧美精品 | 在线观看涩涩视频 | 少妇人妻一区 | 体内射精一区二区 | 禁漫天堂黄漫画无遮挡观看 | 色婷婷av一区二区三区gif | 中文字幕色图 | 久久久久久久国产精品毛片 | 手机看片亚洲 | 午夜久久久久久久久久影院 | 国产又黄又大又粗视频 | 中文字幕在线观看1 | 中文无码一区二区三区在线观看 | 日韩欧美不卡在线 | 一区二区三区四区国产精品 | 国产精品视频大全 | 欧美人妻日韩精品 | 中日韩午夜理伦电影免费 | 毛片av免费看 | 97爱爱| jizz免费视频 | 久久丁香网 | 久久久久久美女 | 自拍偷拍福利 | 精品国产乱码久久久久久1区2区 | 北条麻妃一区二区三区四区五区 | 日韩三级欧美 | 亚洲日本黄色 | 久久久久久www | 久久久久久91亚洲精品中文字幕 | 激情另类小说 | 美女久久视频 | 中文字幕2区 | 天天干天天草 | 日本少妇bbb | 波多野结衣av在线播放 | 成人欧美一区二区三区黑人一 | 成人性生生活性生交3 | 91久久久久一区二区 | 中文字幕1区2区3区 www.com黄色片 | 午夜性影院 | 亚洲精品在线观看av | 国产日产精品一区二区三区四区 | mm131美女视频 | 国产精品成人一区二区 | aa黄色大片 | 激情午夜天 | 麻豆69| 亚洲精品在线观看免费 |