5
<title>Example: DataSource.Function</title>
6
<link rel="stylesheet" href="http://yui.yahooapis.com/3.4.0pr3/build/cssgrids/grids-min.css">
7
<link rel="stylesheet" href="../assets/css/main.css">
8
<link rel="stylesheet" href="../assets/vendor/prettify/prettify-min.css">
9
<script src="../../build/yui/yui-min.js"></script>
14
<h1>Example: DataSource.Function</h1>
19
<div id="main" class="yui3-u">
20
<div class="content"><style scoped>
21
/* custom styles for this example */
22
#demo .output {margin-bottom:1em; padding:10px; border:1px solid #D9D9D9;}
26
<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>
29
<div class="example yui3-skin-sam">
44
resultFields: ["name","id"]
48
<h6>Normalized data</h6>
49
<input type="button" id="demo_array" value="Retrieve data">
50
<div id="demo_output_array" class="output"></div>
62
"category":"exercise",
65
{"name":"biking", "calories":550},
66
{"name":"golf", "calories":1000},
67
{"name":"running", "calories":650},
68
{"name":"swimming", "calories":650},
69
{"name":"walking", "calories":225}
73
"category":"nutrition",
76
{"name":"apple", "calories":70},
77
{"name":"banana", "calories":70},
78
{"name":"orange", "calories":90},
81
{"name":"baked potato", "calories":150},
82
{"name":"broccoli", "calories":50},
83
{"name":"green beans", "calories":30}
89
"category":"exercise",
91
{"day":"sunday", "activity":"swimming"},
92
{"day":"monday", "activity":"running"},
93
{"day":"tuesday", "activity":"biking"},
94
{"day":"wednesday", "activity":"running"},
95
{"day":"thursday", "activity":"swimming"},
96
{"day":"friday", "activity":"running"},
97
{"day":"saturday", "activity":"golf"}
112
resultListLocator: "reference[1].fruit",
113
resultFields: ["name","calories"]
117
<h6>Normalized data</h6>
118
<input type="button" id="demo_json" value="Retrieve data">
119
<div id="demo_output_json" class="output"></div>
122
<script type="text/javascript">
123
YUI().use("dump", "node", "datasource-function", "datasource-arrayschema", "datasource-jsonschema", function (Y) {
124
var myFunctionArray = function(request) {
131
myDataSourceArray = new Y.DataSource.Function({source:myFunctionArray}),
133
success: function(e){
134
Y.one("#demo_output_array").setContent(Y.dump(e.response));
136
failure: function(e){
137
Y.one("#demo_output_array").setContent("Could not retrieve data: " + e.error.message);
141
myDataSourceArray.plug(Y.Plugin.DataSourceArraySchema, {
143
resultFields: ["name","id"]
147
Y.on("click", function(e){
148
myDataSourceArray.sendRequest({callback: myCallbackArray});
151
var myFunctionJSON = function(request) {
152
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":[]}]};
154
myDataSourceJSON = new Y.DataSource.Function({source:myFunctionJSON}),
156
success: function(e){
157
Y.one("#demo_output_json").setContent(Y.dump(e.response));
159
failure: function(e){
160
Y.one("#demo_output_json").setContent("Could not retrieve data: " + e.error.message);
164
myDataSourceJSON.plug(Y.Plugin.DataSourceJSONSchema, {
166
resultListLocator: "reference[1].fruit",
167
resultFields: ["name","calories"]
171
Y.on("click", function(e){
172
myDataSourceJSON.sendRequest({callback:myCallbackJSON});
180
<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>
182
<pre class="code prettyprint">YUI().use("datasource-function", "datasource-arrayschema", function(Y) {
183
var myFunction = function(request) {
185
{name:"abc",id:123},
186
{name:"def",id:456},
187
{name:"ghi",id:789}
190
myDataSource = new Y.DataSource.Function({source:myFunction}),
192
success: function(e){
195
failure: function(e){
196
alert("Could not retrieve data: " + e.error.message);
200
myDataSource.plug(Y.Plugin.DataSourceArraySchema, {
202
resultFields: ["name","id"]
206
myDataSource.sendRequest({callback:myCallback});
210
<p>Whereas JSON data would use a DataSourceJSONSchema plugin:</p>
212
<pre class="code prettyprint">YUI().use("datasource-function", "datasource-jsonschema", function(Y) {
213
var myFunction = function(request) {
215
"profile":{
216
"current":160,
217
"target":150
219
"reference": [
224
"category":"nutrition",
225
"type":"intake",
227
{"name":"apple", "calories":70},
228
{"name":"banana", "calories":70},
229
{"name":"orange", "calories":90},
231
"vegetables":[
232
{"name":"baked potato", "calories":150},
233
{"name":"broccoli", "calories":50},
234
{"name":"green beans", "calories":30}
238
"program": [
243
myDataSource = new Y.DataSource.Function({source:myFunction}),
245
success: function(e){
248
failure: function(e){
249
alert("Could not retrieve data: " + e.error.message);
253
myDataSource.plug(Y.Plugin.DataSourceJSONSchema, {
255
resultListLocator: "reference[1].fruit",
256
resultFields: ["name","calories"]
260
myDataSource.sendRequest({callback:myCallback});
267
<div id="sidebar" class="yui3-u">
271
<div class="sidebox">
273
<h2 class="no-toc">Examples</h2>
277
<ul class="examples">
280
<li data-description="The Local DataSource manages retrieval of in-page data, from JavaScript arrays and objects to DOM elements.">
281
<a href="datasource-local.html">DataSource.Local</a>
286
<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.">
287
<a href="datasource-get.html">DataSource.Get</a>
292
<li data-description="The IO DataSource manages retrieval of data from remote sources, via the IO Utility.">
293
<a href="datasource-io.html">DataSource.IO</a>
298
<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">
299
<a href="datasource-function.html">DataSource.Function</a>
304
<li data-description="Use the DataSourceCache plugin to enable caching and reduce server calls to remote sources.">
305
<a href="datasource-caching.html">DataSource with Caching</a>
310
<li data-description="The DataSourceCache plugin supports offline caching so that cached data persists across browser sessions.">
311
<a href="datasource-offlinecache.html">DataSource with Offline Cache</a>
316
<li data-description="Use the Pollable extension to enable polling in your DataSource.">
317
<a href="datasource-polling.html">DataSource with Polling</a>
329
<div class="sidebox">
331
<h2 class="no-toc">Examples That Use This Component</h2>
335
<ul class="examples">
352
<li data-description="How to provide autocomplete suggestions using a DataSource instance.">
353
<a href="../autocomplete/ac-datasource.html">Remote Data via DataSource</a>
365
<script src="../assets/vendor/prettify/prettify-min.js"></script>
366
<script>prettyPrint();</script>