2 ko.utils.domData = new (function () {
4 var dataStoreKeyExpandoPropertyName = "__ko__" + (new Date).getTime();
7 function getAll(node, createIfNotFound) {
8 var dataStoreKey = node[dataStoreKeyExpandoPropertyName];
9 var hasExistingDataStore = dataStoreKey && (dataStoreKey !== "null") && dataStore[dataStoreKey];
10 if (!hasExistingDataStore) {
11 if (!createIfNotFound)
13 dataStoreKey = node[dataStoreKeyExpandoPropertyName] = "ko" + uniqueId++;
14 dataStore[dataStoreKey] = {};
16 return dataStore[dataStoreKey];
20 get: function (node, key) {
21 var allDataForNode = getAll(node, false);
22 return allDataForNode === undefined ? undefined : allDataForNode[key];
24 set: function (node, key, value) {
25 if (value === undefined) {
26 // Make sure we don't actually create a new domData key if we are actually deleting a value
27 if (getAll(node, false) === undefined)
30 var allDataForNode = getAll(node, true);
31 allDataForNode[key] = value;
33 clear: function (node) {
34 var dataStoreKey = node[dataStoreKeyExpandoPropertyName];
36 delete dataStore[dataStoreKey];
37 node[dataStoreKeyExpandoPropertyName] = null;
38 return true; // Exposing "did clean" flag purely so specs can infer whether things have been cleaned up as intended
43 nextKey: function () {
44 return (uniqueId++) + dataStoreKeyExpandoPropertyName;
49 ko.exportSymbol('utils.domData', ko.utils.domData);
50 ko.exportSymbol('utils.domData.clear', ko.utils.domData.clear); // Exporting only so specs can clear up after themselves fully