Чтобы получать события, которые происходят в 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>