2011-05-12 62 views
12

如何使用KnockoutJS添加分頁?如何使用KnockoutJS將客戶端分頁添加到表中?

我當前的代碼是:

//assuming jsondata is a collection of data correctly passed into this function 

myns.DisplayFields = function(jsondata) { 
    console.debug(jsondata); 
    window.viewModel = { 
     fields: ko.observableArray(jsondata), 
     sortByName: function() { //plus any custom functions I would like to perform 
      this.items.sort(function(a, b) { 
       return a.Name < b.Name ? -1 : 1; 
      }); 
     }, 
    }; 

    ko.applyBindings(viewModel); 
} 

我的觀點:

<table> 
    <tbody data-bind='template: "fieldTemplate"'></tbody> 
</table> 

<script type="text/html" id="fieldTemplate"> 
{{each fields}} 
    <tr> 
     <td> ${ FieldId }</td> 
     <td>${ Type }</td> 
     <td><b>${ Name }</b>: ${ Description }</td> 
    </tr> 
{{/each}} 
</script> 

可能或我使用jQuery,jQuery UI的或其他圖書館?

我見過的KnockoutJS網站爲例:

myModel.gridViewModel = new ko.simpleGrid.viewModel({ 
    data: myModel.items, 
    columns: [ 
     { headerText: "Item Name", rowText: "name" }, 
     { headerText: "Sales Count", rowText: "sales" }, 
     { headerText: "Price", rowText: function (item) { return "$" + item.price.toFixed(2) } } 
    ], 
    pageSize: 4 
}); 

但是在那裏我會補充的pageSize我的代碼?這個pageSize如何在內部運行?

回答

19

基本思想是你有一個dependentObservableComputed Observables它表示當前頁面中的行並將你的表綁定到它。您將切分整個數組以獲取頁面的行。然後,你有頁面按鈕/鏈接來操縱頁面索引,這會導致依賴的觀察者被重新評估,導致當前行。

基於您的代碼,類似:

var myns = {}; 
myns.DisplayFields = function(jsondata) { 
    var viewModel = { 
     fields: ko.observableArray(jsondata), 
     sortByName: function() { //plus any custom functions I would like to perform 
      this.items.sort(function(a, b) { 
       return a.Name < b.Name ? -1 : 1; 
      }); 
     }, 
     pageSize: ko.observable(10), 
     pageIndex: ko.observable(0), 
     previousPage: function() { 
      this.pageIndex(this.pageIndex() - 1); 
     }, 
     nextPage: function() { 
      this.pageIndex(this.pageIndex() + 1); 
     } 
    }; 

    viewModel.maxPageIndex = ko.dependentObservable(function() { 
     return Math.ceil(this.fields().length/this.pageSize()) - 1; 
    }, viewModel); 

    viewModel.pagedRows = ko.dependentObservable(function() { 
     var size = this.pageSize(); 
     var start = this.pageIndex() * size; 
     return this.fields.slice(start, start + size); 
    }, viewModel); 

    ko.applyBindings(viewModel); 
}; 

所以,你要讓你的表綁定到pagedRows

樣品在這裏:http://jsfiddle.net/rniemeyer/5Xr2X/

+0

謝謝,我認爲我需要更好地研究和理解knockout.js,我認爲最好從一個實際的例子開始直接習慣這個庫,以及:) – Haroon 2011-05-12 14:54:19

+0

maxPageIndex函數不是正確。它應該是:Math.ceil(this.fields()。length/this.pageSize()) - 1; – 2011-09-08 12:16:35

+0

謝謝。我看到以前的失敗。更新了答案。 – 2011-09-08 13:16:02

1

也許https://github.com/addyosmani/backbone.paginator是東西給你?來自Github頁面:

Backbone.Paginator是一組用於使用Backbone.js對數據進行分頁的自定義組件。它旨在提供兩種解決方案,用於協助將請求分頁到服務器(例如API)以及單載荷數據的分頁,我們可能希望進一步將N個結果的集合分頁到視圖中的M個頁面中。

+0

下降者會介意他/她爲什麼這麼做? – cburgmer 2012-08-31 12:45:04

+0

投了贊成票。沒有看過bb paginator,但是如果你知道如何將膠水寫入淘汰賽似乎是可行的。 – 2012-11-05 01:15:36

2

你有沒有達到你想要的?

我最近推出了一個很好的尋呼機的例子,使用淘汰賽github。

查看https://github.com/remcoros/ko.pager來源和http://remcoros.github.com/ko.pager/example.html查看工作示例。

所有的計算和一些方便的屬性由'Pager'類提供,您可以創建並綁定到該類。包括一個示例工作模板。

有關文檔和用法,請參閱源碼example.html。

相關問題