Директива angularjs не может получить атрибуты, заканчивающиеся на "-start"

Я хотел использовать on-drag-start как атрибут в директиве AngularJS, называемый ngDraggable.
Однако этот атрибут не представляется возможным.

Следующий код находится в чистом javascript, и я могу получить on-drag-start как атрибут. Я думаю, что могу получить любой атрибут независимо от имени атрибута.

<h1 id="tag1" on-drag-start="START" on-drag="DRAG" on-drag-end="END" >Hello Plunker!</h1>

Атрибуты в чистом javasctipt DEMO: http://plnkr.co/edit/6iODSnf56KtwPFpoC7ck?p=preview

Однако в следующем коде в AngularjS я не могу получить onDragStart как атрибут, но в качестве атрибута можно получить onDragBegin.

<h1 id="tag1" ng-draggable  on-drag="DRAG" on-drag-end="END"
  on-drag-start="START" on-drag-begin="BEGIN">Hello Plunker!</h1>

Атрибуты в директиве AngularJS DEMO: http://plnkr.co/edit/RxABAHHlxQJSSZz91CYW?p=preview

Конечно, я могу изменить свое имя атрибута от on-drag-start до on-drag-begin, но мне любопытно.

Мои вопросы:

  • Почему я не могу использовать on-drag-start как имя атрибута?
  • Какова причина этого?
  • и существует ли общее правило для имен атрибутов?

ПРИМЕЧАНИЕ. Я чувствую, что мой вопрос не совсем отформатирован. Приветствуется переписывание.

Ответ 2

Я сегодня столкнулся с этой точной вещью, и я потратил час или около того, пытаясь понять, что случилось с моей директивой. Я реализую директиву события касания, и я назвал его dac-touch-start, и он был озадачен тем, почему он не срабатывает. В конце концов, я понял, что виноват слово "начало".

Просматривая источник Angular, кажется, что есть специальное положение для слов "start" и "end" в именах директив.

Это функция, которая связывает директивы в ваших шаблонах с определением директивы.

/**
 * Looks for directives on the given node and adds them to the directive collection which is
 * sorted.
 *
 * @param node Node to search.
 * @param directives An array to which the directives are added to. This array is sorted before
 *        the function returns.
 * @param attrs The shared attrs object which is used to populate the normalized attributes.
 * @param {number=} maxPriority Max directive priority.
 */
function collectDirectives(node, directives, attrs, maxPriority, ignoreDirective) {

...

var directiveNName = ngAttrName.replace(/(Start|End)$/, '');
if (ngAttrName === directiveNName + 'Start') {
    attrStartName = name;
    attrEndName = name.substr(0, name.length - 5) + 'end';
    name = name.substr(0, name.length - 6);
}

Это похоже на то, что могут поддерживаться такие директивы, как ng-repeat-start... ng-repeat-end.

Как следует из @mmattax, дело в том, чтобы просто назвать его чем-то другим.

Ответ 3

Итак, coughcough кажется, что добавление фривольного (дополнительного) -старта является обходным путем.

то есть. on-drag-start-start="onStartCallback()".

приводит к атрибуту начала перетаскивания в разметке, и, похоже, он работает на angular 1.2.10.

Ваш пробег может отличаться, и я не проверял никаких других нарушений.