1 // For certain common events (currently just 'click'), allow a simplified data-binding syntax
2 // e.g. click:handler instead of the usual full-length event:{click:handler}
3 function makeEventHandlerShortcut(eventName) {
4 ko.bindingHandlers[eventName] = {
5 'init': function(element, valueAccessor, allBindingsAccessor, viewModel) {
6 var newValueAccessor = function () {
8 result[eventName] = valueAccessor();
11 return ko.bindingHandlers['event']['init'].call(this, element, newValueAccessor, allBindingsAccessor, viewModel);
16 ko.bindingHandlers['event'] = {
17 'init' : function (element, valueAccessor, allBindingsAccessor, viewModel) {
18 var eventsToHandle = valueAccessor() || {};
19 for(var eventNameOutsideClosure in eventsToHandle) {
21 var eventName = eventNameOutsideClosure; // Separate variable to be captured by event handler closure
22 if (typeof eventName == "string") {
23 ko.utils.registerEventHandler(element, eventName, function (event) {
24 var handlerReturnValue;
25 var handlerFunction = valueAccessor()[eventName];
28 var allBindings = allBindingsAccessor();
31 // Take all the event args, and prefix with the viewmodel
32 var argsForHandler = ko.utils.makeArray(arguments);
33 argsForHandler.unshift(viewModel);
34 handlerReturnValue = handlerFunction.apply(viewModel, argsForHandler);
36 if (handlerReturnValue !== true) { // Normally we want to prevent default action. Developer can override this be explicitly returning true.
37 if (event.preventDefault)
38 event.preventDefault();
40 event.returnValue = false;
44 var bubble = allBindings[eventName + 'Bubble'] !== false;
46 event.cancelBubble = true;
47 if (event.stopPropagation)
48 event.stopPropagation();