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