Директивы элементов AngularJS не отображаются при использовании самозакрывающихся тегов
У меня есть в моих html файлах директивы
<add />
<back />
и директивы находятся в форме
.directive('add', ['$window', ...
и
.directive('back', ['$window',
Это отлично работает.
Если я изменю директивы на случай верблюда:
.directive('addPlayer', ['$window', ...
<add_player />
<back />
и
<add:player />
<back />
отображается в то время как
<add-player /> regular dash
<back />
отображается только <add-player>
, и все после этого не отображается.
Любые идеи, почему?
EDIT:
Я как бы получил такое же поведение здесь
http://plnkr.co/edit/cpP4c2TyZwv5Y4BrNUBb?p=preview
Ответы
Ответ 1
Чтобы поставить вопрос на отдых, я цитирую официальное выражение команды AngularJS: (sic)
самозакрывающиеся или недействительные элементы, определенные спецификацией html, очень важны для анализатора браузера. вы не можете сделать свой собственный, поэтому для ваших пользовательских элементов вы должны придерживаться непустых элементов (<foo></foo>
).
это не может быть изменено в angular.
- Игорь Минар
source: https://github.com/angular/angular.js/issues/1953#issuecomment-13135021
Следуйте остальной части беседы на странице AngularJS, где обсуждается возможность использования XHTML
для доставки контента с самозакрывающимися тегами, приемлемыми для браузер. Однако имейте в виду, что он не полностью поддерживается AngularJS.
Ответ 2
Недавно я столкнулся с той же проблемой и смог исправить ее, не используя самозакрывающиеся теги. Попробуйте <add-player></add-player>
вместо самозакрывающейся версии.
Я не знаю, почему самозакрывающиеся теги не работают с тире в имени тега директивы. Быстрое исследование в тот же день и ничего не нашел на стороне HTML/XHTML. Возможно, ошибка/ограничение в Angular?
Ответ 3
Спецификация HTML не позволяет самозакрывающиеся теги для непустых элементов.
Правила синтаксиса HTML [W3C]
Элементы имеют начальный тег, указывающий, где они начинаются. Непустые элементы имеют конечный тег, чтобы указать, где они заканчиваются.
Стартовые теги состоят из следующих частей в точно следующем порядке:
- A "<" характер.
- Имя тега элементов.
- Необязательно, один или несколько атрибутов, каждому из которых должно предшествовать один или несколько пробелов.
- Необязательно, один или несколько символов пробела.
- Необязательно, символ "/", который может присутствовать только в том случае, если элемент является элементом void.
- Символ " > ".
В спецификации HTML5 существует ограниченное количество элементов void > . Вот полный список:
area
, base
, br
, col
, command
, embed
, hr
, img
, input
, keygen
, link
, meta
, param
, source
, track
, wbr
.
Что действительно происходит
Анализатор браузера должен прослушивать спецификацию. Поскольку использование косой черты в теге не-void недействительно, синтаксический анализатор игнорирует окончание />
, а <back />
означает <back>
. Поэтому вы никогда не закрываете первый элемент, который мешает другим работать.
В Plunker у вас есть:
<body>
<back></back>
Self closing <back />
Self closing <back />
</body>
который анализирует на
<body>
<back></back>
Self closing <back>
Self closing <back>
</back>
</back>
</body>
Затем вы указываете template: '<button>back</button>'
в своей директиве, которая заменяет back
(и его дочерние элементы) указанным HTML, в результате чего:
<body>
<back>
<button>back</button>
</back>
Self closing <back>
<button>back</button>
</back>
</body>
Что мне делать тогда?
Используйте <back></back>
для всех, и он будет работать нормально. В качестве альтернативы вы можете использовать атрибуты элемента: <div back="attr"></div>
.
Подробнее см. следующие обсуждения: