Как определить компонент Angular 2 или директиву с несколькими селекторами
Цель:
Предоставляйте селектора синонимов для компонентов и директив в моем приложении.
Мотивация:
Есть моменты, когда компонент или директива предоставляет функциональные возможности, которые можно рассматривать по-разному, в то время как имя селектора должно осмысленно представлять или упрощать представление о том, как работает компонент или директива (это имя мнемоническое устройство).
Исследование:
директивы
Я заметил, что в материале 2 представлены несколько селекторов для его директив MdList
и MdListItem
:
https://github.com/angular/material2/blob/master/src/lib/list/list.ts
@Component({
moduleId: module.id,
selector: 'md-list, md-nav-list',
host: {'role': 'list'},
template: '<ng-content></ng-content>',
styleUrls: ['list.css'],
encapsulation: ViewEncapsulation.None
})
export class MdList {}
... и...
@Component({
moduleId: module.id,
selector: 'md-list-item, a[md-list-item]',
host: {
'role': 'listitem',
'(focus)': '_handleFocus()',
'(blur)': '_handleBlur()',
},
templateUrl: 'list-item.html',
encapsulation: ViewEncapsulation.None
})
export class MdListItem implements AfterContentInit {
...
}
На странице директивы атрибутов Angular 2 в документации:
https://angular.io/docs/ts/latest/guide/attribute-directives.html
@Directive
требуется, чтобы селектор CSS идентифицировал HTML в шаблоне, который связано с нашей директивой. Селектором CSS для атрибута является имя атрибута в квадратных скобках. Селектор директивы [myHighlight]
. Angular найдет все элементы в шаблоне, у которых есть атрибут с именем myHighlight
.
Какая ссылка на следующие селектора атрибутов Страница MDN:
https://developer.mozilla.org/en-US/docs/Web/CSS/Attribute_selectors
На странице Angular 2 Cheat Sheet:
https://angular.io/docs/js/latest/guide/cheatsheet.html
![введите здесь описание изображения]()
Синтаксис запятой селекторов CSS 2 list.ts
, которые я нашел, указывает на то, что они применимы к нескольким ситуациям - моя оценка того, что делают эти селекторы:
-
class MdList
применяется к элементам md-list
и md-nav-list
-
class MdListItem
применяется к элементам md-list-item
и a
, которые имеют атрибут md-list-item
Компоненты
На странице Angular 2 Обзор архитектуры:
https://angular.io/docs/ts/latest/guide/architecture.html
Селектор : селектор CSS, который сообщает Angular создать и вставить экземпляр этого компонента, где он находит тег <hero-list>
в родительском HTML. Для Например, если HTML-приложение содержит <hero-list></hero-list>
, то Angularвставляет экземпляр вида HeroListComponent
между этими тегами.
Интересно, что в дикой природе я не встречал ни одного примера компонента, который имеет несколько селекторов.
Ментальная модель Неверные представления:
Когда я был представлен в Angular 2, я "лениво" интерпретировал selectors
просто как имя компонента или директивы, представленной в приложении HTML
.
В моих (ошибочных) ментальных селекторах компонентов модели, где только способ эффективного определения конкретного приложения HTML
.
В моих (ошибочных) ментальных селекторах директив модели, где только способ определить специфичный для приложения атрибут HTML
, служащий для изменения поведения элемента.
Проведя исследование и тщательно изучив (все слова) документацию, я понял, что здесь есть что-то более сильное...
Общие вопросы:
- Где я получил что-то из этого неправильно?
- Какие другие аспекты селекторов компонентов и директив мне не хватает? например есть ли здесь больше энергии?
Конкретные вопросы:
- Может ли компонент иметь селектор атрибутов элемента? и если да, то каково было бы поведение/эффект?
- В каких ситуациях вы хотите, чтобы директива имела селектор элементов?
- Какой синтаксис применим директиву к синонимам CSS-атрибутов? например применить директиву к любой из групп селекторов атрибутов CSS...
Ответы
Ответ 1
Где я получил какое-либо из вышеуказанных ошибок?
"лениво" интерпретируемые селекторные функции
Я не знаю о лениво интерпретируемых селекторах.
Если тег, который соответствует селектору или компоненту, находится в шаблоне компонентов, он обновляется до компонента Angular.
Если ViewContainerRef.createComponent()
используется (например, маршрутизатор) для динамического добавления компонента, то тег, который соответствует селектору, добавляется в DOM и компонент, примененный к нему.
В моих (ошибочных) ментальных селекторах компонентов модели, где только способ эффективного определения конкретного HTML-элемента приложения.
Селекторы предназначены для сопоставления элемента DOM с компонентом или директивой для Angular, чтобы узнать, какая часть DOM должна стать компонентом или директивой.
Какие другие аспекты селекторов компонентов и директив мне не хватает? например есть ли здесь больше энергии?
Может ли компонент иметь селектор атрибутов элемента? и если да, то каково было бы поведение/эффект?
Вы можете использовать собственные имена тегов, атрибуты и классы CSS и любую их комбинацию. Вы не можете использовать id
или селектора, которые охватывают несколько элементов. При использовании ,
можно выделить несколько селекторов, где компонент добавляется к элементам, где один из них соответствует.
Многие встроенные директивы Angulars используют список селекторов.
В каких ситуациях вы хотите, чтобы директива имела селектор элементов?
Директива такая же, как и компонент, без собственного представления.
<my-dropdown>
<my-item></my-item>
<my-item></my-item>
<my-item></my-item>
</my-dropdown>
Может быть реализован таким компонентом, как
@Component({
selector: 'my-dropdown',
template: '<ng-content></ng-content>'
})
или
@Directive({
selector: 'my-dropdown',
})
и они будут делать то же самое.
Каков синтаксис для применения директивы атрибутов синонима CSS? например применить директиву к любой из групп селекторов атрибутов CSS...
selector: '[attr1],[attr2],[attr3]'
Ответ 2
Довольно прямой вариант решения вашей проблемы:
- Создать класс, описывающий компонент без декоратора
@Component
- Создание классов, расширяющих класс компонентов
- Поместите декораторы на них
- Повторите 2 и 3