ferngully-aurelia-tools
Version:
Ferngully Tools for Aurelia
51 lines • 2.2 kB
JavaScript
import { EventManager, bindingMode } from 'aurelia-binding';
const notApplicableMessage = 'The updateTrigger binding behavior can only be applied to two-way bindings on input/select elements.';
export class updateTriggerOnKeyPressBindingBehavior {
constructor(eventManager) {
this.eventManager = eventManager;
}
bind(binding, source, ...keyCodes) {
if (binding.mode !== bindingMode.twoWay) {
throw new Error(notApplicableMessage);
}
if (keyCodes.length === 0) {
keyCodes = ["Enter"];
}
let targetObserver = binding.observerLocator.getObserver(binding.target, binding.targetProperty);
if (!targetObserver.handler) {
throw new Error(notApplicableMessage);
}
binding.targetObserver = targetObserver;
targetObserver.originalHandler = binding.targetObserver.handler;
let handler = this.createElementHandlerforKeyCodes(['keydown'], keyCodes);
targetObserver.handler = handler;
}
unbind(binding, source) {
binding.targetObserver.handler = binding.targetObserver.originalHandler;
binding.targetObserver.originalHandler = null;
}
createElementHandlerforKeyCodes(events, keyCodes) {
return {
subscribe(target, defaultBindingEventHandler) {
let checkKey = (event) => {
if (keyCodes.indexOf(event.key) !== -1) {
event.stopPropagation();
defaultBindingEventHandler(event);
return false;
}
return true;
};
events.forEach(changeEvent => {
target.addEventListener(changeEvent, checkKey, false);
});
return function () {
events.forEach(changeEvent => {
target.removeEventListener(changeEvent, checkKey);
});
};
}
};
}
}
updateTriggerOnKeyPressBindingBehavior.inject = [EventManager];
//# sourceMappingURL=updateTriggerOnKeyPress.js.map