mirror of
https://github.com/the-djmaze/snappymail.git
synced 2026-08-28 11:39:21 +03:00
48 lines
2 KiB
JavaScript
48 lines
2 KiB
JavaScript
|
|
ko.utils.domData = new (function () {
|
|
var uniqueId = 0;
|
|
var dataStoreKeyExpandoPropertyName = "__ko__" + (Date.now());
|
|
|
|
var getDataForNode, clear;
|
|
// We considered using WeakMap, but it has a problem in IE 11 and Edge that prevents using
|
|
// it cross-window, so instead we just store the data directly on the node.
|
|
// See https://github.com/knockout/knockout/issues/2141
|
|
getDataForNode = function (node, createIfNotFound) {
|
|
var dataForNode = node[dataStoreKeyExpandoPropertyName];
|
|
if (!dataForNode && createIfNotFound) {
|
|
dataForNode = node[dataStoreKeyExpandoPropertyName] = {};
|
|
}
|
|
return dataForNode;
|
|
};
|
|
clear = function (node) {
|
|
if (node[dataStoreKeyExpandoPropertyName]) {
|
|
delete node[dataStoreKeyExpandoPropertyName];
|
|
return true; // Exposing "did clean" flag purely so specs can infer whether things have been cleaned up as intended
|
|
}
|
|
return false;
|
|
};
|
|
|
|
return {
|
|
get: function (node, key) {
|
|
var dataForNode = getDataForNode(node, false);
|
|
return dataForNode && dataForNode[key];
|
|
},
|
|
set: function (node, key, value) {
|
|
// Make sure we don't actually create a new domData key if we are actually deleting a value
|
|
var dataForNode = getDataForNode(node, value !== undefined /* createIfNotFound */);
|
|
dataForNode && (dataForNode[key] = value);
|
|
},
|
|
getOrSet: function (node, key, value) {
|
|
var dataForNode = getDataForNode(node, true /* createIfNotFound */);
|
|
return dataForNode[key] || (dataForNode[key] = value);
|
|
},
|
|
clear: clear,
|
|
|
|
nextKey: function () {
|
|
return (uniqueId++) + dataStoreKeyExpandoPropertyName;
|
|
}
|
|
};
|
|
})();
|
|
|
|
ko.exportSymbol('utils.domData', ko.utils.domData);
|
|
ko.exportSymbol('utils.domData.clear', ko.utils.domData.clear); // Exporting only so specs can clear up after themselves fully
|