You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
173 lines
3.8 KiB
173 lines
3.8 KiB
dojo.provide("dojox.widget.Iterator"); |
|
dojo.require("dijit.Declaration"); |
|
|
|
dojo.experimental("dojox.widget.Iterator"); // level: prototype, designed for dijit.chat.demo |
|
|
|
/* |
|
example: |
|
from markup: |
|
| <span dojoType="dojo.data.ItemFileReadStore" |
|
| jsId="cstore" url="countries.json"></span> |
|
| |
|
| <div> |
|
| <div dojoType="dojox.widget.Iterator" store="cstore" |
|
| query="{ name: 'A*'}"> |
|
| ${name} is a ${type} |
|
| </div> |
|
| </div> |
|
|
|
example: |
|
programmatic: |
|
| var store = new dojo.data.ItemFileReadStore({ url: "countries.json" }); |
|
| |
|
| var iter = new dojox.widget.Iterator({ |
|
| store: store, |
|
| template: "" |
|
| }); |
|
| |
|
|
|
example: |
|
programmatic from an array of objects: |
|
| var dataArr = [ |
|
| { name: "foo", valueAttr: "bar" }, |
|
| { name: "thinger", valueAttr: "blah" } |
|
| ]; |
|
| |
|
| var iter = new dojox.widget.Iterator({ |
|
| data: dataArr, |
|
| template: "" |
|
| }); |
|
|
|
example: |
|
programmatic from an array of strings: |
|
| var dataArr = [ |
|
| { name: "foo", valueAttr: "bar" }, |
|
| { name: "thinger", valueAttr: "blah" } |
|
| ]; |
|
| |
|
| var iter = new dojox.widget.Iterator({ |
|
| data: dataArr, |
|
| template: "" |
|
| }); |
|
|
|
*/ |
|
|
|
|
|
dojo.declare("dojox.widget.Iterator", |
|
[ dijit.Declaration ], |
|
{ |
|
|
|
constructor: (function(){ |
|
var ctr = 0; |
|
return function(){ |
|
this.attrs = []; |
|
this.children = []; |
|
this.widgetClass = "dojox.widget.Iterator._classes._"+(ctr++); |
|
} |
|
})(), |
|
|
|
start: 0, |
|
fetchMax: 1000, |
|
query: { name: "*" }, |
|
attrs: [], |
|
defaultValue: "", |
|
widgetCtor: null, |
|
dataValues: [], // an array of strings |
|
data: null, // should be a reference to an Array |
|
store: null, |
|
_srcIndex: 0, |
|
_srcParent: null, |
|
|
|
_setSrcIndex: function(s){ |
|
this._srcIndex = 0; |
|
this._srcParent = s.parentNode; |
|
var ts = s; |
|
while(ts.previousSibling){ |
|
this._srcIndex++; |
|
ts = ts.previousSibling; |
|
}; |
|
}, |
|
|
|
postscript: function(p, s){ |
|
// figure out the position of the source node in it's parent |
|
this._setSrcIndex(s); |
|
// this._srcIndex = dojo.query(">", this._srcParent).indexOf(s); |
|
|
|
this.inherited("postscript", arguments); |
|
var wc = this.widgetCtor = dojo.getObject(this.widgetClass); |
|
|
|
this.attrs = dojo.map( |
|
wc.prototype.templateString.match(/\$\{([^\s\:\}]+)(?:\:([^\s\:\}]+))?\}/g), |
|
function(s){ return s.slice(2, -1); } |
|
); |
|
dojo.forEach( |
|
this.attrs, |
|
function(m){ wc.prototype[m] = ""; } |
|
); |
|
this.update(); |
|
}, |
|
|
|
clear: function(){ |
|
if(this.children.length){ |
|
this._setSrcIndex(this.children[0].domNode); |
|
} |
|
dojo.forEach(this.children, "item.destroy();"); |
|
this.children = []; |
|
}, |
|
|
|
update: function(){ |
|
if(this.store){ |
|
// we're executing a query |
|
this.fetch(); |
|
}else{ |
|
// we came from an array of objects. Easier! |
|
this.onDataAvailable(this.data||this.dataValues); |
|
} |
|
}, |
|
|
|
_addItem: function(/*Object*/config, idx){ |
|
if(dojo.isString(config)){ |
|
config = { value: config }; |
|
} |
|
var widget = new this.widgetCtor(config); |
|
this.children.push(widget); |
|
dojo.place(widget.domNode, this._srcParent, this._srcIndex+idx); |
|
}, |
|
|
|
getAttrValuesObj: function(item){ |
|
var obj = {}; |
|
if(dojo.isString(item)){ |
|
dojo.forEach(this.attrs, function(attr){ |
|
obj[attr] = (attr == "value") ? item : this.defaultValue; |
|
}, this); |
|
}else{ |
|
dojo.forEach(this.attrs, function(attr){ |
|
if(this.store){ |
|
obj[attr] = this.store.getValue(item, attr)||this.defaultValue; |
|
}else{ |
|
obj[attr] = item[attr]||this.defaultValue; |
|
} |
|
}, this); |
|
} |
|
return obj; |
|
}, |
|
|
|
onDataAvailable: function(data){ |
|
this.clear(); |
|
// console.debug(data); |
|
dojo.forEach(data, function(item, idx){ |
|
this._addItem(this.getAttrValuesObj(item), idx); |
|
}, this); |
|
}, |
|
|
|
fetch: function(query, start, end){ |
|
this.store.fetch({ |
|
query: query||this.query, |
|
start: start||this.start, |
|
count: end||this.fetchMax, |
|
onComplete: dojo.hitch(this,"onDataAvailable") |
|
}); |
|
} |
|
}); |
|
|
|
dojox.widget.Iterator._classes = {};
|
|
|