Skip to content

Instantly share code, notes, and snippets.

@Gwash3189
Created October 6, 2014 05:35
Show Gist options
  • Save Gwash3189/2721395fea31534d371a to your computer and use it in GitHub Desktop.
Save Gwash3189/2721395fea31534d371a to your computer and use it in GitHub Desktop.
Event / Subscribable bus system with Ko Subscribables.
window.Bus = function(name, funcs, parent) {
funcs = funcs instanceof Array === true ? funcs : [funcs];
var bus = {};
var sub = new ko.subscribable();
var functionType = "function";
bus.name = name;
bus.children = [];
bus.previousMessages = [];
bus.extend = function(name, funcs) {
var childBus = window.Bus(name, funcs, bus);
bus.children.push(childBus);
return childBus;
};
bus.subscribe = function(callbacks, target, parent) {
var b = parent || bus;
callbacks = callbacks instanceof Array === true ? callbacks : [callbacks];
callbacks.forEach(function(callback) {
sub.subscribe(callback, target, bus.name);
});
b.previousMessages.forEach(function(previousMessages) {
callbacks.forEach(function(callback){
callback(previousMessages);
});
});
return bus;
};
bus.notify = function(value) {
sub.notifySubscribers(value, bus.name);
bus.previousMessages.push(value);
bus.children.forEach(function(child) {
child.notify(value);
});
return bus;
};
if (funcs !== undefined && funcs.filter(function(value) {
return typeof value === functionType;
}).length === funcs.length) {
bus.subscribe(funcs, undefined, parent);
}
return bus;
};
var RouterBus = Bus("Router", function() {
console.log("Router");
});
var MenuPage = RouterBus.extend("Router.Menu", function() {
console.log("Menu");
});
MenuPage.notify(""); // One Menu log & one im a sub
var SubMenuPage = MenuPage.extend("Router.Menu.Sub", function() {
console.log("im a sub"); //Should show once as there was a previous message in MenuPage
});
SubMenuPage.notify(""); //One im a sub
MenuPage.notify(""); // One Menu log & one im a sub
RouterBus.notify(""); // One Router Log and One Menu Log and im a sub
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment