5
<title>Example: DataSource.Function</title>
6
<link rel="stylesheet" href="http://fonts.googleapis.com/css?family=Maven+Pro:400,700">
7
<link rel="stylesheet" href="../../build/cssgrids/grids-min.css">
8
<link rel="stylesheet" href="../assets/css/main.css">
9
<link rel="stylesheet" href="../assets/vendor/prettify/prettify-min.css">
10
<script src="../../build/yui/yui-min.js"></script>
15
<h1>Example: DataSource.Function</h1>
20
<div class="yui3-u-3-4">
22
<div class="content"><style scoped>
23
/* custom styles for this example */
24
#demo .output {margin-bottom:1em; padding:10px; border:1px solid #D9D9D9;}
28
<p>DataSource.Function allows the implementer to define a JavaScript function that returns data values, for maximum customizeability. A <a href="../dataschema/">DataSchema</a> plugin is used to normalize incoming data into a known format for consistency of usage by other components.</p>
31
<div class="example yui3-skin-sam">
46
resultFields: ["name","id"]
50
<h6>Normalized data</h6>
51
<input type="button" id="demo_array" value="Retrieve data">
52
<div id="demo_output_array" class="output"></div>
64
"category":"exercise",
67
{"name":"biking", "calories":550},
68
{"name":"golf", "calories":1000},
69
{"name":"running", "calories":650},
70
{"name":"swimming", "calories":650},
71
{"name":"walking", "calories":225}
75
"category":"nutrition",
78
{"name":"apple", "calories":70},
79
{"name":"banana", "calories":70},
80
{"name":"orange", "calories":90},
83
{"name":"baked potato", "calories":150},
84
{"name":"broccoli", "calories":50},
85
{"name":"green beans", "calories":30}
91
"category":"exercise",
93
{"day":"sunday", "activity":"swimming"},
94
{"day":"monday", "activity":"running"},
95
{"day":"tuesday", "activity":"biking"},
96
{"day":"wednesday", "activity":"running"},
97
{"day":"thursday", "activity":"swimming"},
98
{"day":"friday", "activity":"running"},
99
{"day":"saturday", "activity":"golf"}
114
resultListLocator: "reference[1].fruit",
115
resultFields: ["name","calories"]
119
<h6>Normalized data</h6>
120
<input type="button" id="demo_json" value="Retrieve data">
121
<div id="demo_output_json" class="output"></div>
124
<script type="text/javascript">
125
YUI().use("dump", "node", "datasource-function", "datasource-arrayschema", "datasource-jsonschema", function (Y) {
126
var myFunctionArray = function(request) {
133
myDataSourceArray = new Y.DataSource.Function({source:myFunctionArray}),
135
success: function(e){
136
Y.one("#demo_output_array").setContent(Y.dump(e.response));
138
failure: function(e){
139
Y.one("#demo_output_array").setContent("Could not retrieve data: " + e.error.message);
143
myDataSourceArray.plug(Y.Plugin.DataSourceArraySchema, {
145
resultFields: ["name","id"]
149
Y.on("click", function(e){
150
myDataSourceArray.sendRequest({callback: myCallbackArray});
153
var myFunctionJSON = function(request) {
154
return {"profile":{"current":160,"target":150},"reference": [{"category":"exercise","type":"expenditure","activities":[{"name":"biking", "calories":550},{"name":"golf", "calories":1000},{"name":"running", "calories":650},{"name":"swimming", "calories":650},{"name":"walking", "calories":225}]},{"category":"nutrition","type":"intake","fruit":[{"name":"apple", "calories":70},{"name":"banana", "calories":70},{"name":"orange", "calories":90},],"vegetables":[{"name":"baked potato", "calories":150},{"name":"broccoli", "calories":50},{"name":"green beans", "calories":30}]}],"program": [{"category":"exercise","schedule":[{"day":"sunday", "activity":"swimming"},{"day":"monday", "activity":"running"},{"day":"tuesday", "activity":"biking"},{"day":"wednesday", "activity":"running"},{"day":"thursday", "activity":"swimming"},{"day":"friday", "activity":"running"},{"day":"saturday", "activity":"golf"}]},{"category":"diet","schedule":[]}]};
156
myDataSourceJSON = new Y.DataSource.Function({source:myFunctionJSON}),
158
success: function(e){
159
Y.one("#demo_output_json").setContent(Y.dump(e.response));
161
failure: function(e){
162
Y.one("#demo_output_json").setContent("Could not retrieve data: " + e.error.message);
166
myDataSourceJSON.plug(Y.Plugin.DataSourceJSONSchema, {
168
resultListLocator: "reference[1].fruit",
169
resultFields: ["name","calories"]
173
Y.on("click", function(e){
174
myDataSourceJSON.sendRequest({callback:myCallbackJSON});
182
<p>Your custom function can return arbitrary data, so use the appropriate schema plugin to normalize the data into a consistent format. Array data would use a DataSourceArraySchema plugin:</p>
184
<pre class="code prettyprint">YUI().use("datasource-function", "datasource-arrayschema", function(Y) {
185
var myFunction = function(request) {
187
{name:"abc",id:123},
188
{name:"def",id:456},
189
{name:"ghi",id:789}
192
myDataSource = new Y.DataSource.Function({source:myFunction}),
194
success: function(e){
197
failure: function(e){
198
alert("Could not retrieve data: " + e.error.message);
202
myDataSource.plug(Y.Plugin.DataSourceArraySchema, {
204
resultFields: ["name","id"]
208
myDataSource.sendRequest({callback:myCallback});
212
<p>Whereas JSON data would use a DataSourceJSONSchema plugin:</p>
214
<pre class="code prettyprint">YUI().use("datasource-function", "datasource-jsonschema", function(Y) {
215
var myFunction = function(request) {
217
"profile":{
218
"current":160,
219
"target":150
221
"reference": [
226
"category":"nutrition",
227
"type":"intake",
229
{"name":"apple", "calories":70},
230
{"name":"banana", "calories":70},
231
{"name":"orange", "calories":90},
233
"vegetables":[
234
{"name":"baked potato", "calories":150},
235
{"name":"broccoli", "calories":50},
236
{"name":"green beans", "calories":30}
240
"program": [
245
myDataSource = new Y.DataSource.Function({source:myFunction}),
247
success: function(e){
250
failure: function(e){
251
alert("Could not retrieve data: " + e.error.message);
255
myDataSource.plug(Y.Plugin.DataSourceJSONSchema, {
257
resultListLocator: "reference[1].fruit",
258
resultFields: ["name","calories"]
262
myDataSource.sendRequest({callback:myCallback});
270
<div class="yui3-u-1-4">
271
<div class="sidebar">
275
<div class="sidebox">
277
<h2 class="no-toc">Examples</h2>
281
<ul class="examples">
284
<li data-description="The Local DataSource manages retrieval of in-page data, from JavaScript arrays and objects to DOM elements.">
285
<a href="datasource-local.html">DataSource.Local</a>
290
<li data-description="The Get DataSource, which manages retrieval of data from remote sources via the Get Utility, can be useful for accessing data from cross-domain servers without the need for a proxy.">
291
<a href="datasource-get.html">DataSource.Get</a>
296
<li data-description="The IO DataSource manages retrieval of data from remote sources, via the IO Utility.">
297
<a href="datasource-io.html">DataSource.IO</a>
302
<li data-description="The Function DataSource, which manages retrieval of data from a JavaScript function, provides a highly customizeable mechanism for implementer-defined data retrieval algorithms">
303
<a href="datasource-function.html">DataSource.Function</a>
308
<li data-description="Use the DataSourceCache plugin to enable caching and reduce server calls to remote sources.">
309
<a href="datasource-caching.html">DataSource with Caching</a>
314
<li data-description="The DataSourceCache plugin supports offline caching so that cached data persists across browser sessions.">
315
<a href="datasource-offlinecache.html">DataSource with Offline Cache</a>
320
<li data-description="Use the Pollable extension to enable polling in your DataSource.">
321
<a href="datasource-polling.html">DataSource with Polling</a>
333
<div class="sidebox">
335
<h2 class="no-toc">Examples That Use This Component</h2>
339
<ul class="examples">
356
<li data-description="How to provide autocomplete suggestions using a DataSource instance.">
357
<a href="../autocomplete/ac-datasource.html">Remote Data via DataSource</a>
370
<script src="../assets/vendor/prettify/prettify-min.js"></script>
371
<script>prettyPrint();</script>