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