Created
October 6, 2014 05:35
-
-
Save Gwash3189/2721395fea31534d371a to your computer and use it in GitHub Desktop.
Event / Subscribable bus system with Ko Subscribables.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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