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 = {};
}