if(!dojo._hasResource["dojox.widget.Iterator"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
dojo._hasResource["dojox.widget.Iterator"] = true;
dojo.provide("dojox.widget.Iterator");
dojo.require("dijit.Declaration");
dojo.experimental("dojox.widget.Iterator"); // level: prototype, designed for dijit.chat.demo
/*
example:
from markup:
|
|
|
|
| ${name} is a ${type}
|
|
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 = {};
}