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.
119 lines (105 loc) • 3.78 kB
JavaScript
define([
"dojo/_base/array",
"dojo/_base/declare",
"dijit/registry",
"./_DataMixin",
"./ListItem",
"dojo/has",
"dojo/has!dojo-bidi?dojox/mobile/bidi/_StoreListMixin"
], function(array, declare, registry, DataMixin, ListItem, has, BidiDataListMixin){
// module:
// dojox/mobile/_DataListMixin
var _DataListMixin = declare(has("dojo-bidi") ? "dojox.mobile._NonBidiDataListMixin" : "dojox.mobile._DataListMixin", DataMixin, {
// summary:
// Mixin for widgets to generate the list items corresponding to
// the data provider object.
// description:
// 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 name.
// 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.
var attr = {};
var arr = this.store.getLabelAttributes(item);
var labelAttr = arr ? arr[0] : null;
array.forEach(this.store.getAttributes(item), function(name){
if(name === labelAttr){
attr["label"] = this.store.getLabel(item);
}else{
attr[(this.itemMap && this.itemMap[name]) || name] = this.store.getValue(item, name);
}
}, this);
// 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 attr["dir"] == "undefined"){
attr["dir"] = this.isLeftToRight() ? "ltr" : "rtl";
}
var w = new this.itemRenderer(attr);
item._widgetId = w.id;
return w;
},
generateList: function(/*Array*/items, /*Object*/dataObject){
// 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));
}, this);
},
onComplete: function(/*Array*/items, /*Object*/request){
// summary:
// An handler that is called after the fetch completes.
this.generateList(items, request);
},
onError: function(/*Object*/errorData, /*Object*/request){
// summary:
// An error handler.
},
onSet: function(/*Object*/item, /*String*/attribute, /*Object|Array*/oldValue, /*Object|Array*/newValue){
// summary:
// See dojo/data/api/Notification.onSet().
},
onNew: function(/*Object*/newItem, /*Object?*/parentInfo){
// summary:
// See dojo/data/api/Notification.onNew().
this.addChild(this.createListItem(newItem));
},
onDelete: function(/*Object*/deletedItem){
// summary:
// See dojo/data/api/Notification.onDelete().
registry.byId(deletedItem._widgetId).destroyRecursive();
},
onStoreClose: function(/*Object?*/request){
// summary:
// Refresh list on close.
if(this.store.clearOnClose){
this.refresh();
}
}
});
return has("dojo-bidi") ? declare("dojox.mobile._DataListMixin", [_DataListMixin, BidiDataListMixin]) : _DataListMixin;
});