1 | <!DOCTYPE html> |
---|
2 | <html> |
---|
3 | <head> |
---|
4 | <meta charset="utf-8"> |
---|
5 | <title>Knockout Grid</title> |
---|
6 | <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> |
---|
7 | <meta name="viewport" content="width=960"> |
---|
8 | <!-- jQuery --> |
---|
9 | <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"></script> |
---|
10 | <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.23/jquery-ui.min.js"></script> |
---|
11 | <!-- Wijmo CSS and script --> |
---|
12 | <link type="text/css" href="http://cdn.wijmo.com/themes/metro/jquery-wijmo.css" rel="stylesheet" title="metro-jqueryui" /> |
---|
13 | <link type="text/css" href="http://cdn.wijmo.com/jquery.wijmo-complete.all.2.2.0.min.css" rel="stylesheet" /> |
---|
14 | <script type="text/javascript" src="http://cdn.wijmo.com/jquery.wijmo-open.all.2.2.0.min.js"></script> |
---|
15 | <script type="text/javascript" src="http://cdn.wijmo.com/jquery.wijmo-complete.all.2.2.0.min.js"></script> |
---|
16 | <!-- KnockoutJS for MVVM--> |
---|
17 | <script type="text/javascript" src="http://cdn.wijmo.com/external/knockout-2.1.0.js"></script> |
---|
18 | <script type="text/javascript" src="http://cdn.wijmo.com/external/knockout.wijmo.js"></script> |
---|
19 | |
---|
20 | <script type="text/javascript"> |
---|
21 | //Class constructor for grid row. Returns observable properties. |
---|
22 | var product = function (data) { |
---|
23 | return { |
---|
24 | ProductID: ko.observable(data.ProductID), |
---|
25 | ProductName: ko.observable(data.ProductName), |
---|
26 | UnitPrice: ko.observable(data.UnitPrice), |
---|
27 | UnitsInStock: ko.observable(data.UnitsInStock) |
---|
28 | }; |
---|
29 | }; |
---|
30 | |
---|
31 | //Create ViewModel |
---|
32 | var viewModel = { |
---|
33 | pageSize: ko.observable(10), |
---|
34 | pageIndex: ko.observable(0), |
---|
35 | sortCommand: ko.observable("ProductID asc"), |
---|
36 | dataRows: ko.observableArray([]), |
---|
37 | totalRows: ko.observable(0), |
---|
38 | sorted: function (e, data) { |
---|
39 | viewModel.sortCommand(data.sortCommand); |
---|
40 | }, |
---|
41 | paged: function (e, data) { |
---|
42 | viewModel.pageIndex(data.newPageIndex); |
---|
43 | }, |
---|
44 | load: function () { |
---|
45 | $.ajax({ |
---|
46 | url: "http://services.odata.org/Northwind/Northwind.svc/Products", |
---|
47 | dataType: "jsonp", |
---|
48 | jsonp: "$callback", |
---|
49 | data: { |
---|
50 | $format: "json", |
---|
51 | $inlinecount: "allpages", |
---|
52 | $select: "ProductID,ProductName,UnitPrice,UnitsInStock", |
---|
53 | $orderby: viewModel.sortCommand(), |
---|
54 | $top: viewModel.pageSize(), |
---|
55 | $skip: viewModel.pageIndex() * viewModel.pageSize(), |
---|
56 | "paging[pageIndex]": viewModel.pageIndex(), |
---|
57 | "paging[pageSize]": viewModel.pageSize() |
---|
58 | }, |
---|
59 | success: function (result) { |
---|
60 | var data = result.d.results; |
---|
61 | var arr = []; |
---|
62 | |
---|
63 | $.each(data, function (i) { |
---|
64 | arr.push(new product(data[i])); |
---|
65 | }); |
---|
66 | viewModel.totalRows(result.d.__count); |
---|
67 | viewModel.dataRows(arr); |
---|
68 | } |
---|
69 | }); |
---|
70 | } |
---|
71 | |
---|
72 | }; |
---|
73 | |
---|
74 | //Bind ViewModel and Event Handlers |
---|
75 | $(document).ready(function () { |
---|
76 | ko.applyBindings(viewModel); |
---|
77 | viewModel.load(); |
---|
78 | viewModel.sortCommand.subscribe(function (newValue) { |
---|
79 | viewModel.load(); |
---|
80 | }); |
---|
81 | viewModel.pageIndex.subscribe(function (newValue) { |
---|
82 | viewModel.load(); |
---|
83 | }); |
---|
84 | viewModel.pageSize.subscribe(function (newValue) { |
---|
85 | viewModel.load(); |
---|
86 | $(":wijmo-wijdropdown").wijdropdown("refresh"); |
---|
87 | }); |
---|
88 | }); |
---|
89 | </script> |
---|
90 | <style type="text/css"> |
---|
91 | body |
---|
92 | { |
---|
93 | font-family: "Segoe UI Light", Frutiger, "Frutiger Linotype", "Dejavu Sans", "Helvetica Neue", Arial, sans-serif; |
---|
94 | font-size: 14px; |
---|
95 | background: #000; |
---|
96 | } |
---|
97 | |
---|
98 | h1 |
---|
99 | { |
---|
100 | font-size: 2.4em; |
---|
101 | color: #fff; |
---|
102 | padding: 20px 0 0 6px; |
---|
103 | margin: 0; |
---|
104 | } |
---|
105 | |
---|
106 | .container |
---|
107 | { |
---|
108 | margin: 0 auto; |
---|
109 | width: 960px; |
---|
110 | } |
---|
111 | |
---|
112 | .app |
---|
113 | { |
---|
114 | overflow: hidden; |
---|
115 | background: #fff; |
---|
116 | padding: 20px; |
---|
117 | box-shadow: 5px 5px 50px rgba(0, 0, 0, 0.5); |
---|
118 | } |
---|
119 | |
---|
120 | .toolbar |
---|
121 | { |
---|
122 | text-align: right; |
---|
123 | } |
---|
124 | |
---|
125 | #dataGrid |
---|
126 | { |
---|
127 | width: 100%; |
---|
128 | } |
---|
129 | </style> |
---|
130 | </head> |
---|
131 | <body> |
---|
132 | <div class="container"> |
---|
133 | <h1>Knockout Grid</h1> |
---|
134 | <div class="app"> |
---|
135 | <div> |
---|
136 | <div class="toolbar"> |
---|
137 | <label>Display: </label> |
---|
138 | <select data-bind="value: pageSize, wijdropdown: {}"> |
---|
139 | <option value="5">5</option> |
---|
140 | <option value="10" selected="selected">10</option> |
---|
141 | <option value="20">20</option> |
---|
142 | </select> |
---|
143 | </div> |
---|
144 | <table id="dataGrid" data-bind=" |
---|
145 | wijgrid: { |
---|
146 | data: dataRows, |
---|
147 | pageSize: pageSize, |
---|
148 | pageIndex: pageIndex, |
---|
149 | totalRows: totalRows, |
---|
150 | allowPaging: true, |
---|
151 | allowSorting: true, |
---|
152 | sorted: sorted, |
---|
153 | pageIndexChanged: paged, |
---|
154 | columns: [ |
---|
155 | { sortDirection: 'ascending', dataType: 'number', dataFormatString: 'n0', headerText: 'ID', width: 60 }, |
---|
156 | { headerText: 'Product' }, |
---|
157 | { dataType: 'currency', headerText: 'Price', width: 100}, |
---|
158 | { dataType: 'number', dataFormatString: 'n0', headerText: 'Units', width: 100}] |
---|
159 | }"> |
---|
160 | </table> |
---|
161 | </div> |
---|
162 | <p> |
---|
163 | Made with <a href="http://knockoutjs.com">KnockoutJS</a>, <a href="http://wijmo.com">Wijmo</a> and <a href="http://www.odata.org">OData</a> |
---|
164 | </p> |
---|
165 | </div> |
---|
166 | </div> |
---|
167 | </body> |
---|
168 | </html> |
---|