mirror of
https://github.com/the-djmaze/snappymail.git
synced 2026-08-30 20:49:20 +03:00
70 lines
2.9 KiB
JavaScript
70 lines
2.9 KiB
JavaScript
|
|
ko.memoization = (function () {
|
|
var memos = {};
|
|
|
|
function randomMax8HexChars() {
|
|
return (((1 + Math.random()) * 0x100000000) | 0).toString(16).substring(1);
|
|
}
|
|
function generateRandomId() {
|
|
return randomMax8HexChars() + randomMax8HexChars();
|
|
}
|
|
function findMemoNodes(rootNode, appendToArray) {
|
|
if (!rootNode)
|
|
return;
|
|
if (rootNode.nodeType == 8) {
|
|
var memoId = ko.memoization.parseMemoText(rootNode.nodeValue);
|
|
if (memoId != null)
|
|
appendToArray.push({ domNode: rootNode, memoId: memoId });
|
|
} else if (rootNode.nodeType == 1) {
|
|
for (var i = 0, childNodes = rootNode.childNodes, j = childNodes.length; i < j; i++)
|
|
findMemoNodes(childNodes[i], appendToArray);
|
|
}
|
|
}
|
|
|
|
return {
|
|
memoize: function (callback) {
|
|
if (typeof callback != "function")
|
|
throw new Error("You can only pass a function to ko.memoization.memoize()");
|
|
var memoId = generateRandomId();
|
|
memos[memoId] = callback;
|
|
return "<!--[ko_memo:" + memoId + "]-->";
|
|
},
|
|
|
|
unmemoize: function (memoId, callbackParams) {
|
|
var callback = memos[memoId];
|
|
if (callback === undefined)
|
|
throw new Error("Couldn't find any memo with ID " + memoId + ". Perhaps it's already been unmemoized.");
|
|
try {
|
|
callback.apply(null, callbackParams || []);
|
|
return true;
|
|
}
|
|
finally { delete memos[memoId]; }
|
|
},
|
|
|
|
unmemoizeDomNodeAndDescendants: function (domNode, extraCallbackParamsArray) {
|
|
var memos = [];
|
|
findMemoNodes(domNode, memos);
|
|
for (var i = 0, j = memos.length; i < j; i++) {
|
|
var node = memos[i].domNode;
|
|
var combinedParams = [node];
|
|
if (extraCallbackParamsArray)
|
|
ko.utils.arrayPushAll(combinedParams, extraCallbackParamsArray);
|
|
ko.memoization.unmemoize(memos[i].memoId, combinedParams);
|
|
node.nodeValue = ""; // Neuter this node so we don't try to unmemoize it again
|
|
if (node.parentNode)
|
|
node.parentNode.removeChild(node); // If possible, erase it totally (not always possible - someone else might just hold a reference to it then call unmemoizeDomNodeAndDescendants again)
|
|
}
|
|
},
|
|
|
|
parseMemoText: function (memoText) {
|
|
var match = memoText.match(/^\[ko_memo\:(.*?)\]$/);
|
|
return match ? match[1] : null;
|
|
}
|
|
};
|
|
})();
|
|
|
|
ko.exportSymbol('memoization', ko.memoization);
|
|
ko.exportSymbol('memoization.memoize', ko.memoization.memoize);
|
|
ko.exportSymbol('memoization.unmemoize', ko.memoization.unmemoize);
|
|
ko.exportSymbol('memoization.parseMemoText', ko.memoization.parseMemoText);
|
|
ko.exportSymbol('memoization.unmemoizeDomNodeAndDescendants', ko.memoization.unmemoizeDomNodeAndDescendants);
|