中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

Bootstrap與KnockoutJs相結合實現分頁效果實例詳解
來源:易賢網 閱讀:1380 次 日期:2016-07-06 10:48:02
溫馨提示:易賢網小編為您整理了“Bootstrap與KnockoutJs相結合實現分頁效果實例詳解”,方便廣大網友查閱!

KnockoutJS是一個JavaScript實現的MVVM框架。接下來通過本文給大家介紹Bootstrap與KnockoutJs相結合實現分頁效果,對bootstrap knockoutjs相關知識感興趣的朋友一起學習吧

KnockoutJS是一個JavaScript實現的MVVM框架。非常棒。比如列表數據項增減后,不需要重新刷新整個控件片段或自己寫JS增刪節點,只要預先定義模板和符合其語法定義的屬性即可。簡單的說,我們只需要關注數據的存取。

一、引言

由于最近公司的系統需要改版,改版的新系統我打算使用KnockoutJs來制作Web前端。在做的過程中,遇到一個問題——如何使用KnockoutJs來完成分頁的功能。在前一篇文章中并沒有介紹使用KnockoutJs來實現分頁,所以在這篇文章中,將補充用KnockoutJs+Bootstrap來實現數據的分頁顯示。

二、使用KnockoutJs實現分頁

這里采用了兩種方式來實現分頁,第一種是將所有數據加載出來,然后再將所有數據分頁顯示;第二種是每次都只加載部分數據,每次請求都重新加載后面的數據。

對于這兩種方式,使用Razor方式實現的分頁一般都會采用第二種方式來實現分頁,但是對于單頁面程序來說,第一種實現方式也有其好處,對于不是非常大量的數據完全可以采用第一種實現方式,因為這樣的話,后面的數據的加載,用戶體驗非常的流暢。所以這里將分別介紹這兩種實現方式。

2.1 每次加載部分數據的實現

這里的后端代碼采用的是前一篇文章的代碼,只是多加了一些示例數據而已。具體的后端實現代碼為:

/// <summary>

 /// Web API 服務,為Web前端提供數據服務

 /// </summary>

 public class TaskController : ApiController

 {

  private readonly TaskRepository _taskRepository = TaskRepository.Current;

  public IEnumerable<Task> GetAll()

  {

   return _taskRepository.GetAll().OrderBy(a => a.Id);

  }

  [Route("api/task/GetByPaged")]

  public PagedModel GetAll([FromUri]int pageIndex)

  {

   const int pageSize = 3;

   int totalCount;

   var tasks = _taskRepository.GetAll(pageIndex, pageSize, out totalCount).OrderBy(a => a.Id);

   var pageData = new PagedModel()

   {

    PageIndex = pageIndex,

    PagedData = tasks.ToList(),

    TotalCount = totalCount,

    PageCount = (totalCount+ pageSize -1) / pageSize

   };

   //返回數據

   return pageData;

  }

 }

/// <summary>

 /// 任務倉儲,封裝了所有關于數據庫的操作

 /// </summary>

 public class TaskRepository

 {

  #region Static Filed

  private static Lazy<TaskRepository> _taskRepository = new Lazy<TaskRepository>(() => new TaskRepository());

  public static TaskRepository Current

  {

   get { return _taskRepository.Value; }

  }

  #endregion

  #region Fields

  private readonly List<Task> _tasks = new List<Task>()

  {

   new Task

   {

    Id =1,

    Name = "創建一個SPA程序",

    Description = "SPA(single page web application),SPA的優勢就是少量帶寬,平滑體驗",

    Owner = "Learning hard",

    FinishTime = DateTime.Parse(DateTime.Now.AddDays(1).ToString(CultureInfo.InvariantCulture))

   },

   new Task

   {

    Id =2,

    Name = "學習KnockoutJs",

    Description = "KnockoutJs是一個MVVM類庫,支持雙向綁定",

    Owner = "Tommy Li",

    FinishTime = DateTime.Parse(DateTime.Now.AddDays(2).ToString(CultureInfo.InvariantCulture))

   },

   new Task

   {

    Id =3,

    Name = "學習AngularJS",

    Description = "AngularJs是MVVM框架,集MVVM和MVC與一體。",

    Owner = "李志",

    FinishTime = DateTime.Parse(DateTime.Now.AddDays(3).ToString(CultureInfo.InvariantCulture))

   },

   new Task

   {

    Id =4,

    Name = "學習ASP.NET MVC網站",

    Description = "Glimpse是一款.NET下的性能測試工具,支持asp.net 、asp.net mvc, EF等等,優勢在于,不需要修改原項目任何代碼,且能輸出代碼執行各個環節的執行時間",

    Owner = "Tonny Li",

    FinishTime = DateTime.Parse(DateTime.Now.AddDays(4).ToString(CultureInfo.InvariantCulture))

   },

   new Task

   {

    Id =5,

    Name = "測試任務1",

    Description = "測試任務1",

    Owner = "李志",

    FinishTime = DateTime.Parse(DateTime.Now.AddDays(5).ToString(CultureInfo.InvariantCulture))

   },

   new Task

   {

    Id =6,

    Name = "測試任務2",

    Description = "測試任務2",

    Owner = "李志",

    FinishTime = DateTime.Parse(DateTime.Now.AddDays(6).ToString(CultureInfo.InvariantCulture))

   },

   new Task

   {

    Id =7,

    Name = "測試任務3",

    Description = "測試任務3",

    Owner = "李志",

    FinishTime = DateTime.Parse(DateTime.Now.AddDays(7).ToString(CultureInfo.InvariantCulture))

   },

  };

  #endregion

  #region Public Methods

  public IEnumerable<Task> GetAll()

  {

   return _tasks;

  }

  public IEnumerable<Task> GetAll(int pageNumber, int pageSize, out int totalCount)

  {

   var skip = (pageNumber - 1) * pageSize;

   var take = pageSize;

   totalCount = _tasks.Count;

   return _tasks.Skip(skip).Take(take);

  }

  public Task Get(int id)

  {

   return _tasks.Find(p => p.Id == id);

  }

  public Task Add(Task item)

  {

   if (item == null)

   {

    throw new ArgumentNullException("item");

   }

   item.Id = _tasks.Count + 1;

   _tasks.Add(item);

   return item;

  }

  public void Remove(int id)

  {

   _tasks.RemoveAll(p => p.Id == id);

  }

  public bool Update(Task item)

  {

   if (item == null)

   {

    throw new ArgumentNullException("item");

   }

   var taskItem = Get(item.Id);

   if (taskItem == null)

   {

    return false;

   }

   _tasks.Remove(taskItem);

   _tasks.Add(item);

   return true;

  }

  #endregion

 }

Web前端的實現代碼:

@{

ViewBag.Title = "Index2";

Layout = "~/Views/Shared/_Layout.cshtml";

}

<div id="list2">

<h2>分頁第二種實現方式——任務列表</h2>

<div class="table-responsive">

<table class="table table-striped">

<thead>

<tr>

<th>編號</th>

<th>名稱</th>

<th>描述</th>

<th>負責人</th>

<th>創建時間</th>

<th>完成時間</th>

<th>狀態</th>

</tr>

</thead>

<tbody data-bind="foreach:pagedList">

<tr>

<td data-bind="text: id"></td>

<td><a data-bind="text: name"></a></td>

<td data-bind="text: description"></td>

<td data-bind="text: owner"></td>

<td data-bind="text: creationTime"></td>

<td data-bind="text: finishTime"></td>

<td data-bind="text: state"></td>

</tr>

</tbody>

<tbody data-bind="if: loadingState">

<tr>

<td colspan="8" class="text-center">

<img width="60" src="/images/loading.gif" />

</td>

</tr>

</tbody>

<tfoot data-bind="ifnot:loadingState">

<tr>

<td colspan="8">

<div class="pull-right">

<div>總共有<span data-bind="text: totalCount"></span>條記錄, 每頁顯示:<span data-bind="text: pageSize"></span>條</div>

<div>

<ul class="pagination">

<li data-bind="css: { disabled: pageIndex() === 1 }"><a href="#" data-bind="click: previous">«</a></li>

</ul>

<ul data-bind="foreach: allPages" class="pagination">

<li data-bind="css: { active: $data.pageNumber === ($root.pageIndex()) }"><a href="#" data-bind="text: $data.pageNumber, click: function() { $root.gotoPage($data.pageNumber); }"></a></li>

</ul>

<ul class="pagination"><li data-bind="css: { disabled: pageIndex() === pageCount }"><a href="#" data-bind="click: next">»</a></li></ul>

</div>

</div>

</td>

</tr>

</tfoot>

</table>

</div>

</div>

對應的Js實現為:

// 實現分頁的第二種方式

var ListViewModel2 = function() {

//viewModel本身。用來防止直接使用this的時候作用域混亂

var self = this;

self.loadingState = ko.observable(true);

self.pageSize = ko.observable(3);

//數據

this.pagedList = ko.observableArray();

//要訪問的頁碼

this.pageIndex = ko.observable(1);

//總頁數

this.pageCount = ko.observable(1);

//頁碼數

this.allPages = ko.observableArray();

//當前頁

this.currengePage = ko.observable(1);

self.totalCount = ko.observable(1);

this.refresh = function() {

//限制請求頁碼在該數據頁碼范圍內

if (self.pageIndex() < 1)

self.pageIndex(1);

if (self.pageIndex() > self.pageCount()) {

self.pageIndex(self.pageCount());

}

//post異步加載數據

sendAjaxRequest("GET", function (data) {

// 加載新的數據前,先移除原先的數據

self.pagedList.removeAll();

self.allPages.removeAll();

self.totalCount(data.totalCount);

self.pageCount(data.pageCount);

self.loadingState(false);

for (var i = 1; i <= data.pageCount; i++) {

//裝填頁碼

self.allPages.push({ pageNumber: i });

}

//for...in 語句用于對數組或者對象的屬性進行循環操作。

//for ... in 循環中的代碼每執行一次,就會對數組的元素或者對象的屬性進行一次操作。

for (var i in data.pagedData) {

//裝填數據

self.pagedList.push(data.pagedData[i]);

}

}, 'GetByPaged', { 'pageIndex': self.pageIndex() });

};

//請求第一頁數據

this.first = function() {

self.pageIndex(1);

self.refresh();

};

//請求下一頁數據

this.next = function() {

self.pageIndex(this.pageIndex() + 1);

self.refresh();

};

//請求先前一頁數據

this.previous = function() {

self.pageIndex(this.pageIndex() - 1);

self.refresh();

};

//請求最后一頁數據

this.last = function() {

self.pageIndex(this.pageCount() - 1);

self.refresh();

};

//跳轉到某頁

this.gotoPage = function (data, event) {

self.pageIndex(data);

self.refresh();

};

};

function sendAjaxRequest(httpMethod, callback, url, reqData) {

$.ajax("/api/task" + (url ? "/" + url : ""), {

type: httpMethod,

success: callback,

data: reqData

});

}

$(document).ready(function () {

var viewModel = new ListViewModel2();

viewModel.refresh();

if ($('#list2').length)

ko.applyBindings(viewModel, $('#list2').get(0));

});

這里介紹了下使用KnockoutJs實現分頁功能的實現思路:

1.頁面加載完成之后,發起Ajax請求去異步調用REST 服務來請求部分數據。

2.然后將請求的數據通過KnockoutJs綁定顯示。

3.將對應的分頁信息綁定到Bootstrap分頁中

4.當用戶點擊翻頁時,再發起一個Ajax請求去異步調用Rest服務請求數據,再將請求的數據顯示出來。

這上面是描述的代碼的調用邏輯關系,你可以參考對應的JS代碼來理解上面的描述。到此我們第二種實現方式就實現完成了。

2.2 第一次加載所有數據,然后將所有數據分頁顯示

接下來就介紹了第一種實現方式,這樣的實現方式,用戶只會在第一次的時候才會感覺到數據加載中,翻頁過程中感覺不到頁面的加載,這樣對于一些本身數據了不是太多的情況下,對于用戶的感覺也是更加流暢的。

其具體的實現思路,也就是將請求的數據不要全部顯示在頁面上,因為數據太多,一下子顯示到頁面中,用戶可能會眼花繚亂。將數據分頁顯示將使得用戶查看更加清晰。

具體的Web前端Js的實現代碼為:

var ListViewModel = function () {

var self = this;

window.viewModel = self;

self.list = ko.observableArray();

self.pageSize = ko.observable(3); 

self.pageIndex = ko.observable(0); //要訪問的頁碼

self.totalCount = ko.observable(1); //總記錄數

self.loadingState = ko.observable(true);

self.pagedList = ko.dependentObservable(function () {

var size = self.pageSize();

var start = self.pageIndex() * size;

return self.list.slice(start, start + size);

});

self.maxPageIndex = ko.dependentObservable(function () {

return Math.ceil(self.list().length / self.pageSize()) - 1;

});

self.previousPage = function () {

if (self.pageIndex() > 0) {

self.pageIndex(self.pageIndex() - 1);

}

};

self.nextPage = function () {

if (self.pageIndex() < self.maxPageIndex()) {

self.pageIndex(self.pageIndex() + 1);

}

};

self.allPages = ko.dependentObservable(function () {

var pages = [];

for (var i = 0; i <= self.maxPageIndex() ; i++) {

pages.push({ pageNumber: (i + 1) });

}

return pages;

});

self.moveToPage = function (index) {

self.pageIndex(index);

};

};

var listViewModel = new ListViewModel();

function bindViewModel() {

sendAjaxRequest("GET", function (data) {

listViewModel.loadingState(false);

listViewModel.list(data);

listViewModel.totalCount(data.length);

if ($('#list').length)

ko.applyBindings(listViewModel, $('#list').get(0));

}, null, null);

}

$(document).ready(function () {

bindViewModel();

});

其前端頁面的實現與前面的實現類似。具體頁面代碼如下:

@{

ViewBag.Title = "Index";

Layout = "~/Views/Shared/_Layout.cshtml";

}

<div id="list">

<h2>任務列表</h2>

<div class="table-responsive">

<table class="table table-striped">

<thead>

<tr>

<th>編號</th>

<th>名稱</th>

<th>描述</th>

<th>負責人</th>

<th>創建時間</th>

<th>完成時間</th>

<th>狀態</th>

</tr>

</thead>

<tbody data-bind="foreach:pagedList">

<tr>

<td data-bind="text: id"></td>

<td><a data-bind="text: name"></a></td>

<td data-bind="text: description"></td>

<td data-bind="text: owner"></td>

<td data-bind="text: creationTime"></td>

<td data-bind="text: finishTime"></td>

<td data-bind="text: state"></td>

</tr>

</tbody>

<tbody data-bind="if:loadingState">

<tr>

<td colspan="8" class="text-center">

<img width="60" src="/images/loading.gif" />

</td>

</tr>

</tbody>

<tfoot data-bind="ifnot:loadingState">

<tr>

<td colspan="8">

<div class="pull-right">

<div>總共有<span data-bind="text: totalCount"></span>條記錄, 每頁顯示:<span data-bind="text: pageSize"></span>條</div>

<div>

<ul class="pagination">

<li data-bind="css: { disabled: pageIndex() === 0 }"><a href="#" data-bind="click: previousPage">«</a></li>

</ul>

<ul data-bind="foreach: allPages" class="pagination">

<li data-bind="css: { active: $data.pageNumber === ($root.pageIndex() + 1) }"><a href="#" data-bind="text: $data.pageNumber, click: function() { $root.moveToPage($data.pageNumber-1); }"></a></li>

</ul>

<ul class="pagination"><li data-bind="css: { disabled: pageIndex() === maxPageIndex() }"><a href="#" data-bind="click: nextPage">»</a></li></ul>

</div>

</div>

</td>

</tr>

</tfoot>

</table>

</div>

</div>

三、運行效果

接下來,讓我們看看,使用KnockoutJs實現的分頁效果:

名單

四、總結

到這里,本文要介紹的內容就結束,盡管本文實現的內容相對比較簡單,但是對于一些剛接觸KnockoutJs的朋友來說,相信本文的實現會是一個很多的指導。接下來,我將會為大家分享下AngularJs的相關內容。

以上所述是小編給大家介紹的Bootstrap與KnockoutJs相結合實現分頁效果實例詳解,希望對大家有所幫助!

更多信息請查看網絡編程
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026上岸·考公考編培訓報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
欧美美女bb生活片| 精品成人一区二区| 久久久精品2019中文字幕神马| 欧美专区日韩视频| 久久久久一区二区三区| 欧美精品成人91久久久久久久| 国产精品久久久久三级| 国模精品一区二区三区色天香| 亚洲激情一区| 午夜精品亚洲一区二区三区嫩草| 久久亚洲精品伦理| 国产精品第一区| 1204国产成人精品视频| 亚洲欧美成人一区二区三区| 欧美 亚欧 日韩视频在线| 99热精品在线观看| 欧美在线视频一区二区三区| 欧美激情中文字幕在线| 国产日韩精品一区二区三区| 亚洲电影天堂av| 国产字幕视频一区二区| 亚洲国产婷婷香蕉久久久久久| 欧美日本在线一区| 国产伦精品一区二区三区| 黄色成人av在线| 亚洲在线观看视频网站| 又紧又大又爽精品一区二区| 一区二区三区日韩| 国产一区免费视频| 欧美日韩精品免费观看| 亚洲成色777777在线观看影院| 国产精品久久久久久久久免费| 99re亚洲国产精品| 亚洲国产精品女人久久久| 欧美日韩不卡| 欧美一二三视频| 在线免费日韩片| 国产日韩精品一区二区三区| 欧美日韩日本国产亚洲在线 | 亚洲激情综合| 国产美女精品免费电影| 亚洲国产精品久久| 久久人人97超碰精品888| 国产精品实拍| 亚洲午夜高清视频| 欧美日韩综合在线| 在线免费一区三区| 久久不射网站| 国产欧美一区二区视频| 午夜精品久久久久久久99水蜜桃| 国产精品h在线观看| 一本久道久久综合狠狠爱| 欧美激情精品| 日韩一区二区福利| 欧美日韩中文在线| 亚洲天堂av综合网| 国产亚洲欧美一区| 国产精自产拍久久久久久| 久久www免费人成看片高清| 日韩视频中文| 亚洲国产成人av在线| 亚洲一级黄色| 99精品国产热久久91蜜凸| 国外成人在线视频| 另类春色校园亚洲| 欧美丰满少妇xxxbbb| 欧美怡红院视频| 欧美中文字幕不卡| 亚洲精品国产精品国自产观看浪潮| 午夜视频一区二区| 国产精品久久久久一区二区三区共| 欧美激情女人20p| 麻豆国产va免费精品高清在线| 亚洲网站在线播放| 日韩视频免费观看| 亚洲精品婷婷| 亚洲激情视频在线| 国产日韩一级二级三级| 国产精品分类| 国产精品国产三级国产专区53| 欧美日韩高清区| 久久青草久久| 欧美一区二区成人6969| 久久久久久尹人网香蕉| 午夜精品美女久久久久av福利| 国产精品资源| 欧美精品123区| 亚洲第一偷拍| 久久综合激情| 最新日韩av| 欧美精品在线视频观看| 一本久久综合亚洲鲁鲁| 欧美一级久久久久久久大片| 欧美韩国在线| 亚洲人成人一区二区三区| 亚洲一二区在线| 一区二区国产精品| 久久这里只有| 中文av字幕一区| 国产一区二区三区在线观看免费 | 欧美成ee人免费视频| 一本久道久久综合狠狠爱| 国产日韩精品久久| 欧美日韩精品免费观看视频| 久久婷婷久久一区二区三区| 亚洲免费影视第一页| 亚洲国产一区二区a毛片| 国产伦精品一区二区三区在线观看 | 国产精品网站视频| 牛牛国产精品| 久久精品一区二区三区四区| 中文精品在线| 亚洲精品欧美| 黄色免费成人| 国产日韩一区二区三区| 国产精品久久久91| 欧美日韩精品福利| 欧美黄污视频| 欧美韩国在线| 麻豆av福利av久久av| 久久久久久久综合狠狠综合| 欧美一级二级三级蜜桃| 亚洲免费人成在线视频观看| 中文精品视频| 亚洲一级电影| 亚洲一区二区三区影院| 亚洲视频精品在线| 9久草视频在线视频精品| 亚洲精品久久久久久久久久久久 | 在线日韩欧美视频| 国产人成精品一区二区三| 欧美小视频在线观看| 欧美日韩二区三区| 欧美区高清在线| 欧美日韩成人| 国产精品yjizz| 国产精品网站视频| 国产欧美精品一区二区色综合| 国产欧美欧洲在线观看| 国产欧美日韩专区发布| 国产精品专区h在线观看| 国产偷国产偷精品高清尤物| 国产视频自拍一区| 国产在线播放一区二区三区| 国产主播一区二区三区| 一区在线免费| 亚洲激情视频在线播放| 亚洲日本精品国产第一区| 日韩一级不卡| 亚洲欧美变态国产另类| 久久精品道一区二区三区| 久久综合网hezyo| 欧美屁股在线| 国产精品久久久久久久久借妻| 国产伦精品一区| 激情综合五月天| 亚洲精品九九| 亚洲综合第一| 久久夜色精品亚洲噜噜国产mv | 在线电影欧美日韩一区二区私密| 伊甸园精品99久久久久久| 亚洲精品久久久久久久久久久久 | 国内精品一区二区| 1000部精品久久久久久久久| 亚洲看片免费| 性欧美暴力猛交69hd| 另类春色校园亚洲| 欧美视频手机在线| 国产一区二区三区自拍| 亚洲人线精品午夜| 亚洲欧美日韩精品久久亚洲区| 久久精品女人的天堂av| 欧美激情片在线观看| 国产精品自拍网站| 亚洲黄色在线看| 亚洲综合久久久久| 另类av导航| 国产精品乱码妇女bbbb| 黄色av日韩| 亚洲无毛电影| 久久综合九色欧美综合狠狠| 欧美区视频在线观看| 国产亚洲欧美日韩在线一区| 日韩视频一区二区在线观看 | 亚洲人成人99网站| 午夜欧美电影在线观看| 欧美刺激午夜性久久久久久久| 国产精品丝袜91| 亚洲激情成人| 欧美一区视频在线| 欧美日韩在线播放一区| 精品福利免费观看| 欧美日韩国产综合新一区| 国产一区二区三区在线观看网站| 一本一本a久久| 久久综合色88| 国产欧美日本| 中日韩在线视频| 欧美韩日亚洲| 亚洲国产99精品国自产|