-
Notifications
You must be signed in to change notification settings - Fork 10
/
ko.datasource.js
100 lines (84 loc) · 3.02 KB
/
ko.datasource.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
/*! https:/CraigCav/ko.datasource */
(function ( ko ) {
function datasource( source, target ) {
var _target = target || ko.observable(),
paused = true,
trigger = ko.observable( false ),
loading = ko.observable( false ),
result = ko.computed( {
read: function () {
if ( paused ) {
paused = false;
trigger( true );
}
return _target();
},
write: function ( newValue ) {
_target( newValue );
loading( false );
},
deferEvaluation: true
} );
ko.computed( function () {
if ( !trigger() ) return;
loading( true );
source.call( result );
} );
result.refresh = function () {
trigger( trigger() + 1 );
};
result.loading = loading;
return result;
}
function Pager( limit ) {
this.page = ko.observable( 1 );
this.totalCount = ko.observable( 0 );
this.limit = ko.observable( limit );
this.totalPages = ko.computed( function () {
var count = Math.ceil( ko.utils.unwrapObservable( this.totalCount ) / ko.utils.unwrapObservable( this.limit ) )
return count == 0 ? 1 : count;
}, this );
this.pages = ko.computed(function () {
var a = [];
var count = this.totalPages();
for (var p = 0; p < count; p++) {
a.push(p + 1);
}
return a;
}, this);
this.next = function () {
var currentPage = this.page();
this.page( currentPage + 1 );
} .bind( this );
this.previous = function () {
var currentPage = this.page();
this.page( currentPage === 0 ? 0 : currentPage - 1 );
} .bind( this );
this.specific = function (page) {
this.page(page);
}.bind(this);
this.first = function () {
this.page( 1 );
} .bind( this );
this.last = function () {
this.page( this.totalPages() );
} .bind( this );
this.isFirstPage = ko.computed(function () {
return this.page() == 1;
}, this);
this.isLastPage = ko.computed(function () {
return this.page() == this.totalPages();
}, this);
}
ko.extenders.datasource = function ( target, source ) {
var result = datasource( source, target );
result.options = target.options || {};
return result;
};
ko.extenders.pager = function ( target, options ) {
var pager = new Pager( options.limit || 10 );
target.options = target.options || {};
target.options.pager = target.pager = pager;
return target;
};
} )( ko );