176 lines
5.5 KiB
JavaScript
176 lines
5.5 KiB
JavaScript
|
dojo.provide("dojox.wire.DataWire");
|
||
|
|
||
|
dojo.require("dojox.wire.Wire");
|
||
|
|
||
|
dojo.declare("dojox.wire.DataWire", dojox.wire.Wire, {
|
||
|
// summary:
|
||
|
// A Wire for item attributes of data stores
|
||
|
// description:
|
||
|
// This class accesses item attributes of data stores with a dotted
|
||
|
// notation of attribute names specified to 'attribute' property,
|
||
|
// using data APIs of a data store specified to 'dataStore' property.
|
||
|
// The root object for this class must be an item of the data store.
|
||
|
// Intermediate attribute names in the dotted notation specify
|
||
|
// attributes for child items, which are used for repeated calls to
|
||
|
// data APIs until reached to a descendant attribute.
|
||
|
// Attribute names may have an array index, such as "a[0]", to
|
||
|
// identify an array element of the attribute value.
|
||
|
|
||
|
_wireClass: "dojox.wire.DataWire",
|
||
|
|
||
|
constructor: function(/*Object*/args){
|
||
|
// summary:
|
||
|
// Initialize properties
|
||
|
// description:
|
||
|
// If 'dataStore' property is not specified, but 'parent' property
|
||
|
// is specified, 'dataStore' property is copied from the parent.
|
||
|
// args:
|
||
|
// Arguments to initialize properties
|
||
|
// dataStore:
|
||
|
// A data store
|
||
|
// attribute:
|
||
|
// A dotted notation to a descendant attribute
|
||
|
if(!this.dataStore && this.parent){
|
||
|
this.dataStore = this.parent.dataStore;
|
||
|
}
|
||
|
},
|
||
|
_getValue: function(/*Object*/object){
|
||
|
// summary:
|
||
|
// Return an attribute value of an item
|
||
|
// description:
|
||
|
// This method uses a root item passed in 'object' argument and
|
||
|
// 'attribute' property to call getValue() method of
|
||
|
// 'dataStore'.
|
||
|
// If an attribute name have an array suffix ("[]"), getValues()
|
||
|
// method is called, instead.
|
||
|
// If an index is specified in the array suffix, an array element
|
||
|
// for the index is returned, instead of the array itself.
|
||
|
// object:
|
||
|
// A root item
|
||
|
// returns:
|
||
|
// A value found, otherwise 'undefined'
|
||
|
if(!object || !this.attribute || !this.dataStore){
|
||
|
return object; //Object
|
||
|
}
|
||
|
|
||
|
var value = object;
|
||
|
var list = this.attribute.split('.');
|
||
|
for(var i in list){
|
||
|
value = this._getAttributeValue(value, list[i]);
|
||
|
if(!value){
|
||
|
return undefined; //undefined
|
||
|
}
|
||
|
}
|
||
|
return value; //anything
|
||
|
},
|
||
|
|
||
|
_setValue: function(/*Object*/object, /*anything*/value){
|
||
|
// summary:
|
||
|
// Set an attribute value to an item
|
||
|
// description:
|
||
|
// This method uses a root item passed in 'object' argument and
|
||
|
// 'attribute' property to identify an item.
|
||
|
// Then, setValue() method of 'dataStore' is called with a leaf
|
||
|
// attribute name and 'value' argument.
|
||
|
// If an attribute name have an array suffix ("[]"), setValues()
|
||
|
// method is called, instead.
|
||
|
// If an index is specified in the array suffix, an array element
|
||
|
// for the index is set to 'value', instead of the array itself.
|
||
|
// object:
|
||
|
// A root item
|
||
|
// value:
|
||
|
// A value to set
|
||
|
// returns:
|
||
|
// 'object', or 'undefined' for invalid attribute
|
||
|
if(!object || !this.attribute || !this.dataStore){
|
||
|
return object; //Object
|
||
|
}
|
||
|
|
||
|
var item = object;
|
||
|
var list = this.attribute.split('.');
|
||
|
var last = list.length - 1;
|
||
|
for(var i = 0; i < last; i++){
|
||
|
item = this._getAttributeValue(item, list[i]);
|
||
|
if(!item){
|
||
|
return undefined; //undefined
|
||
|
}
|
||
|
}
|
||
|
this._setAttributeValue(item, list[last], value);
|
||
|
return object; //Object
|
||
|
},
|
||
|
|
||
|
_getAttributeValue: function(/*Object*/item, /*String*/attribute){
|
||
|
// summary:
|
||
|
// Return an attribute value of an item
|
||
|
// description:
|
||
|
// This method uses an item passed in 'item' argument and
|
||
|
// 'attribute' argument to call getValue() method of 'dataStore'.
|
||
|
// If an attribute name have an array suffix ("[]"), getValues()
|
||
|
// method is called, instead.
|
||
|
// If an index is specified in the array suffix, an array element
|
||
|
// for the index is returned, instead of the array itself.
|
||
|
// item:
|
||
|
// An item
|
||
|
// attribute
|
||
|
// An attribute name
|
||
|
// returns:
|
||
|
// A value found, otherwise 'undefined'
|
||
|
var value = undefined;
|
||
|
var i1 = attribute.indexOf('[');
|
||
|
if(i1 >= 0){
|
||
|
var i2 = attribute.indexOf(']');
|
||
|
var index = attribute.substring(i1 + 1, i2);
|
||
|
attribute = attribute.substring(0, i1);
|
||
|
var array = this.dataStore.getValues(item, attribute);
|
||
|
if(array){
|
||
|
if(!index){ // return array for "attribute[]"
|
||
|
value = array;
|
||
|
}else{
|
||
|
value = array[index];
|
||
|
}
|
||
|
}
|
||
|
}else{
|
||
|
value = this.dataStore.getValue(item, attribute);
|
||
|
}
|
||
|
return value; //anything
|
||
|
},
|
||
|
|
||
|
_setAttributeValue: function(/*Object*/item, /*String*/attribute, /*anything*/value){
|
||
|
// summary:
|
||
|
// Set an attribute value to an item
|
||
|
// description:
|
||
|
// This method uses an item passed in 'item' argument and
|
||
|
// 'attribute' argument to call setValue() method of 'dataStore'
|
||
|
// with 'value' argument.
|
||
|
// If an attribute name have an array suffix ("[]"), setValues()
|
||
|
// method is called, instead.
|
||
|
// If an index is specified in the array suffix, an array element
|
||
|
// for the index is set to 'value', instead of the array itself.
|
||
|
// item:
|
||
|
// An item
|
||
|
// attribute:
|
||
|
// An attribute name
|
||
|
// value:
|
||
|
// A value to set
|
||
|
var i1 = attribute.indexOf('[');
|
||
|
if(i1 >= 0){
|
||
|
var i2 = attribute.indexOf(']');
|
||
|
var index = attribute.substring(i1 + 1, i2);
|
||
|
attribute = attribute.substring(0, i1);
|
||
|
var array = null;
|
||
|
if(!index){ // replace whole array for "attribute[]"
|
||
|
array = value;
|
||
|
}else{
|
||
|
array = this.dataStore.getValues(item, attribute);
|
||
|
if(!array){
|
||
|
array = [];
|
||
|
}
|
||
|
array[index] = value;
|
||
|
}
|
||
|
this.dataStore.setValues(item, attribute, array);
|
||
|
}else{
|
||
|
this.dataStore.setValue(item, attribute, value);
|
||
|
}
|
||
|
}
|
||
|
});
|