dojox
Version:
Dojo eXtensions, a rollup of many useful sub-projects and varying states of maturity – from very stable and robust, to alpha and experimental. See individual projects contain README files for details.
125 lines (110 loc) • 4.09 kB
JavaScript
define([
"dojo/_base/array",
"dojo/_base/declare",
"./_StoreMixin",
"./ListItem",
"dojo/has",
"dojo/has!dojo-bidi?dojox/mobile/bidi/_StoreListMixin"
], function(array, declare, StoreMixin, ListItem, has, BidiStoreListMixin){
// module:
// dojox/mobile/_StoreListMixin
var _StoreListMixin = declare(has("dojo-bidi") ? "dojox.mobile._NonBidiStoreListMixin" : "dojox.mobile._StoreListMixin", StoreMixin, {
// summary:
// Mixin for widgets to generate the list items corresponding to
// the dojo/store data provider object.
// description:
// Mixin for widgets to generate the list items corresponding to
// the dojo/store data provider object.
// By mixing this class into the widgets, the list item nodes are
// generated as the child nodes of the widget and automatically
// regenerated whenever the corresponding data items are modified.
// append: Boolean
// If true, refresh() does not clear the existing items.
append: false,
// itemMap: Object
// An optional parameter mapping field names from the store to ItemList names.
// Example: itemMap:{text:'label', profile_image_url:'icon'}
itemMap: null,
// itemRenderer: ListItem class or subclass
// The class used to create list items. Default is dojox/mobile/ListItem.
itemRenderer: ListItem,
buildRendering: function(){
this.inherited(arguments);
if(!this.store){ return; }
var store = this.store;
this.store = null;
this.setStore(store, this.query, this.queryOptions);
},
createListItem: function(/*Object*/item){
// summary:
// Creates a list item widget.
return new this.itemRenderer(this._createItemProperties(item));
},
_createItemProperties: function(/*Object*/item){
// summary:
// Creates list item properties.
var props = {};
if(!item["label"]){
props["label"] = item[this.labelProperty];
}
// TODO this code should be like for textDir in the bidi mixin createListItem method
// however for that dynamic set/get of the dir property must be supported first
// that is why for now as a workaround we keep the code here
if(has("dojo-bidi") && typeof props["dir"] == "undefined"){
props["dir"] = this.isLeftToRight() ? "ltr" : "rtl";
}
for(var name in item){
props[(this.itemMap && this.itemMap[name]) || name] = item[name];
}
return props;
},
_setDirAttr: function(props){
// summary:
// Set the 'dir' attribute to support Mirroring.
// To be implemented by the bidi/_StoreLisMixin.js
return props;
},
generateList: function(/*Array*/items){
// summary:
// Given the data, generates a list of items.
if(!this.append){
array.forEach(this.getChildren(), function(child){
child.destroyRecursive();
});
}
array.forEach(items, function(item, index){
this.addChild(this.createListItem(item));
if(item[this.childrenProperty]){
array.forEach(item[this.childrenProperty], function(child, index){
this.addChild(this.createListItem(child));
}, this);
}
}, this);
},
onComplete: function(/*Array*/items){
// summary:
// A handler that is called after the fetch completes.
this.generateList(items);
},
onError: function(/*Object*/ /*===== errorData =====*/){
// summary:
// An error handler.
},
onAdd: function(/*Object*/item, /*Number*/insertedInto){
// summary:
// Calls createListItem and adds the new list item when a new data item has been added to the store.
this.addChild(this.createListItem(item), insertedInto);
},
onUpdate: function(/*Object*/item, /*Number*/insertedInto){
// summary:
// Updates an existing list item when a data item has been modified.
this.getChildren()[insertedInto].set(this._createItemProperties(item));
},
onDelete: function(/*Object*/item, /*Number*/removedFrom){
// summary:
// Deletes an existing item.
this.getChildren()[removedFrom].destroyRecursive();
}
});
return has("dojo-bidi") ? declare("dojox.mobile._StoreListMixin", [_StoreListMixin, BidiStoreListMixin]) : _StoreListMixin;
});