You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
openNG/old/lib/riot/mixins/on-child.js

58 lines
1.4 KiB
JavaScript

'use strict';
const riotQuery = require("riot-query");
const arrayDiff = require("arraydiff");
module.exports = {
init: function() {
let knownTags = [];
let listeners = {};
function triggerEvent(action, query, item) {
if (listeners[query] != null && listeners[query][action] != null) {
listeners[query][action].forEach((handler) => {
handler(item);
});
}
}
this.on("updated", () => {
Object.keys(listeners).forEach((query) => {
let currentTags = riotQuery(this, query);
let diff = arrayDiff(knownTags, currentTags);
diff.forEach((item) => {
if (item.type === "remove") {
for (let i = item.index; i < (item.index + item.howMany); i++) {
triggerEvent("remove", query, knownTags[i]);
}
} else if (item.type === "move") {
for (let i = item.index; i < (item.from + item.howMany); i++) {
triggerEvent("move", query, knownTags[i]);
}
} else if (item.type === "insert") {
item.values.forEach((value) => {
triggerEvent("create", query, value);
})
}
});
knownTags = currentTags;
});
});
this.onChild = function(eventName, handler) {
let [action, query] = eventName.split(":", 2);
if (listeners[query] == null) {
listeners[query] = {};
}
if (listeners[query][action] == null) {
listeners[query][action] = [];
}
listeners[query][action].push(handler);
}
}
}