Чтобы получать события, которые происходят в DOM шаблона, используется метод templateAction. Этот метод получает два параметра: name имя действия и event - браузерное событие.
На самом деле
eventне настоящее браузерное событие, а его клон дополненный свойствами и методами. Настоящее событие хранится в его свойствеevent_. Такой подход используется во многих библиотеках, чтобы иметь возможность расширить объект события дополнительными свойствами и методами, т.к. объектEventрасширять нельзя.
var node = new basis.ui.Node({
template:
'<div>' +
'<button event-click="up">Up</button>' +
'<button event-click="down">Down</button>' +
'</div>',
templateAction: function(name, event){
console.log(name, event.type);
}
});
// как только пользователь нажмет кнопку "Up" в консоли будет
// console> "up" "click"
// для кнопки "Down" в консоли будет
// console> "down" "click"
Для удобства добавления обработчиков на определенные действия, используется свойство action. Это расширяемое свойство (extensibeProperty), где ключи являются названиями действий, а значения - функции-обработчики этих действий, которые получают объект события event. Для того, чтобы вызывался определенный обработчик в basis.ui.Node метод templateAction определен так:
basis.ui.Node.prototype.templateAction = function(actionName, event){
var action = this.action[actionName];
if (action)
action.call(this, event);
if (!action)
basis.dev.warn('template call `' + actionName + '` action, but it isn\'t defined in action list');
};
Если обработчик есть в action, то он вызывается. Иначе в консоли будет выведено предупреждающее сообщение, так как это скорей всего ошибка в шаблоне или в action. В результате такого определения метода templateAction, становится просто определять обработчики на определенные действия.
var node = new basis.ui.Node({
template:
'<div>' +
'<button event-click="up">Up</button>' +
'<button event-click="down">Down</button>' +
'</div>',
action: {
up: function(event){
console.log('up', event.type);
},
down: function(event){
console.log('down', event.type);
}
}
});
На данный момент для basis.ui.Node определен лишь один обработчик по умолчанию - select. Он делает текущий узел выбранным, если это возможно. Если у узла есть contextSelection и он разрешает множественный выбор узлов, то учитывается состояние клавиш ctrl (Windows) и meta (Mac OS) для определения режима выделения (множественный выбор или единичный).
basis.ui.Node.prototype.action.select = function(event){
if (this.isDisabled())
return;
if (this.contextSelection && this.contextSelection.multiple)
this.select(event.ctrlKey || event.metaKey);
else
this.select();
};
Эта реализация покрывает большинство случаев связанных с выделением узлов.
Шаблонизатор поддерживает 3 специальных действия: prevent-default, stop-propagation, log-event.
stop-propagation превращается в event.stopPropagation()prevent-default превращается в event.preventDefault()log-event в режиме разработке выводит в консоль информацию о событии (basis.dev.log('Template event:', event))Например, если требуется отменить действие на клик по умолчанию:
<a href="..." event-click="prevent-default">...</a>