New file |
0,0 → 1,291 |
/* |
Copyright (c) 2004-2006, The Dojo Foundation |
All Rights Reserved. |
|
Licensed under the Academic Free License version 2.1 or above OR the |
modified BSD license. For more information on Dojo licensing, see: |
|
http://dojotoolkit.org/community/licensing.shtml |
*/ |
|
dojo.provide("dojo.collections.Store"); |
dojo.require("dojo.lang.common"); |
dojo.collections.Store = function (jsonArray) { |
var data = []; |
var items = {}; |
this.keyField = "Id"; |
this.get = function () { |
return data; |
}; |
this.getByKey = function (key) { |
return items[key]; |
}; |
this.getByIndex = function (idx) { |
return data[idx]; |
}; |
this.getIndexOf = function (key) { |
for (var i = 0; i < data.length; i++) { |
if (data[i].key == key) { |
return i; |
} |
} |
return -1; |
}; |
this.getData = function () { |
var arr = []; |
for (var i = 0; i < data.length; i++) { |
arr.push(data[i].src); |
} |
return arr; |
}; |
this.getDataByKey = function (key) { |
if (items[key] != null) { |
return items[key].src; |
} |
return null; |
}; |
this.getIndexOfData = function (obj) { |
for (var i = 0; i < data.length; i++) { |
if (data[i].src == obj) { |
return i; |
} |
} |
return -1; |
}; |
this.getDataByIndex = function (idx) { |
if (data[idx]) { |
return data[idx].src; |
} |
return null; |
}; |
this.update = function (obj, fieldPath, val, bDontFire) { |
var parts = fieldPath.split("."), i = 0, o = obj, field; |
if (parts.length > 1) { |
field = parts.pop(); |
do { |
if (parts[i].indexOf("()") > -1) { |
var temp = parts[i++].split("()")[0]; |
if (!o[temp]) { |
dojo.raise("dojo.collections.Store.getField(obj, '" + field + "'): '" + temp + "' is not a property of the passed object."); |
} else { |
o = o[temp](); |
} |
} else { |
o = o[parts[i++]]; |
} |
} while (i < parts.length && o != null); |
} else { |
field = parts[0]; |
} |
obj[field] = val; |
if (!bDontFire) { |
this.onUpdateField(obj, fieldPath, val); |
} |
}; |
this.forEach = function (fn) { |
if (Array.forEach) { |
Array.forEach(data, fn, this); |
} else { |
for (var i = 0; i < data.length; i++) { |
fn.call(this, data[i]); |
} |
} |
}; |
this.forEachData = function (fn) { |
if (Array.forEach) { |
Array.forEach(this.getData(), fn, this); |
} else { |
var a = this.getData(); |
for (var i = 0; i < a.length; i++) { |
fn.call(this, a[i]); |
} |
} |
}; |
this.setData = function (arr, bDontFire) { |
data = []; |
for (var i = 0; i < arr.length; i++) { |
var o = {key:arr[i][this.keyField], src:arr[i]}; |
data.push(o); |
items[o.key] = o; |
} |
if (!bDontFire) { |
this.onSetData(); |
} |
}; |
this.clearData = function (bDontFire) { |
data = []; |
items = {}; |
if (!bDontFire) { |
this.onClearData(); |
} |
}; |
this.addData = function (obj, key, bDontFire) { |
var k = key || obj[this.keyField]; |
if (items[k] != null) { |
var o = items[k]; |
o.src = obj; |
} else { |
var o = {key:k, src:obj}; |
data.push(o); |
items[o.key] = o; |
} |
if (!bDontFire) { |
this.onAddData(o); |
} |
}; |
this.addDataRange = function (arr, bDontFire) { |
var objects = []; |
for (var i = 0; i < arr.length; i++) { |
var k = arr[i][this.keyField]; |
if (items[k] != null) { |
var o = items[k]; |
o.src = arr[i]; |
} else { |
var o = {key:k, src:arr[i]}; |
data.push(o); |
items[k] = o; |
} |
objects.push(o); |
} |
if (!bDontFire) { |
this.onAddDataRange(objects); |
} |
}; |
this.addDataByIndex = function (obj, idx, key, bDontFire) { |
var k = key || obj[this.keyField]; |
if (items[k] != null) { |
var i = this.getIndexOf(k); |
var o = data.splice(i, 1); |
o.src = obj; |
} else { |
var o = {key:k, src:obj}; |
items[k] = o; |
} |
data.splice(idx, 0, o); |
if (!bDontFire) { |
this.onAddData(o); |
} |
}; |
this.addDataRangeByIndex = function (arr, idx, bDontFire) { |
var objects = []; |
for (var i = 0; i < arr.length; i++) { |
var k = arr[i][this.keyField]; |
if (items[k] != null) { |
var j = this.getIndexOf(k); |
var o = data.splice(j, 1); |
o.src = arr[i]; |
} else { |
var o = {key:k, src:arr[i]}; |
items[k] = o; |
} |
objects.push(o); |
} |
data.splice(idx, 0, objects); |
if (!bDontFire) { |
this.onAddDataRange(objects); |
} |
}; |
this.removeData = function (obj, bDontFire) { |
var idx = -1; |
var o = null; |
for (var i = 0; i < data.length; i++) { |
if (data[i].src == obj) { |
idx = i; |
o = data[i]; |
break; |
} |
} |
if (!bDontFire) { |
this.onRemoveData(o); |
} |
if (idx > -1) { |
data.splice(idx, 1); |
delete items[o.key]; |
} |
}; |
this.removeDataRange = function (idx, range, bDontFire) { |
var ret = data.splice(idx, range); |
for (var i = 0; i < ret.length; i++) { |
delete items[ret[i].key]; |
} |
if (!bDontFire) { |
this.onRemoveDataRange(ret); |
} |
return ret; |
}; |
this.removeDataByKey = function (key, bDontFire) { |
this.removeData(this.getDataByKey(key), bDontFire); |
}; |
this.removeDataByIndex = function (idx, bDontFire) { |
this.removeData(this.getDataByIndex(idx), bDontFire); |
}; |
if (jsonArray && jsonArray.length && jsonArray[0]) { |
this.setData(jsonArray, true); |
} |
}; |
dojo.extend(dojo.collections.Store, {getField:function (obj, field) { |
var parts = field.split("."), i = 0, o = obj; |
do { |
if (parts[i].indexOf("()") > -1) { |
var temp = parts[i++].split("()")[0]; |
if (!o[temp]) { |
dojo.raise("dojo.collections.Store.getField(obj, '" + field + "'): '" + temp + "' is not a property of the passed object."); |
} else { |
o = o[temp](); |
} |
} else { |
o = o[parts[i++]]; |
} |
} while (i < parts.length && o != null); |
if (i < parts.length) { |
dojo.raise("dojo.collections.Store.getField(obj, '" + field + "'): '" + field + "' is not a property of the passed object."); |
} |
return o; |
}, getFromHtml:function (meta, body, fnMod) { |
var rows = body.rows; |
var ctor = function (row) { |
var obj = {}; |
for (var i = 0; i < meta.length; i++) { |
var o = obj; |
var data = row.cells[i].innerHTML; |
var p = meta[i].getField(); |
if (p.indexOf(".") > -1) { |
p = p.split("."); |
while (p.length > 1) { |
var pr = p.shift(); |
o[pr] = {}; |
o = o[pr]; |
} |
p = p[0]; |
} |
var type = meta[i].getType(); |
if (type == String) { |
o[p] = data; |
} else { |
if (data) { |
o[p] = new type(data); |
} else { |
o[p] = new type(); |
} |
} |
} |
return obj; |
}; |
var arr = []; |
for (var i = 0; i < rows.length; i++) { |
var o = ctor(rows[i]); |
if (fnMod) { |
fnMod(o, rows[i]); |
} |
arr.push(o); |
} |
return arr; |
}, onSetData:function () { |
}, onClearData:function () { |
}, onAddData:function (obj) { |
}, onAddDataRange:function (arr) { |
}, onRemoveData:function (obj) { |
}, onRemoveDataRange:function (arr) { |
}, onUpdateField:function (obj, field, val) { |
}}); |
|