
В предыдущих статьях мы дали обзор Angular . Что касается пользовательских инструкций, то мы смогли их написать, но в реальных сценариях нам все равно необходимо стандартизированное управление.
Angular — это обновленная версия Angular.js. [Рекомендуемые связанные учебные пособия: «Учебное пособие по Angular»]
Итак, в этой статье мы будем использовать Tooltip для объяснения содержания пользовательских инструкций.
Онлайн-рендеринг, а именно:

Структура каталогов
основана на проекте кода, реализованном в предыдущей статье. Выполните командную строку:
# Войдите в папку директив $ cd Directives. #Создать папку подсказок$ mkdir подсказка # Введите папку всплывающей подсказки $ cd Tooltip # Создать компонент всплывающей подсказки $ ng создать всплывающую подсказку компонента # Создать директиву всплывающей подсказки $ ng создать всплывающую подсказку директивы
После выполнения приведенной выше командной строки вы получите следующую структуру каталогов файлов app/directive/tooltip
: ├── всплывающая подсказка // компонент всплывающей подсказки │ ├── user-list.comComponent.html // скелет страницы │ ├── user-list.comComponent.scss // уникальный стиль страницы │ ├── спецификация user-list.comComponent. .ts // Тестовый файл │ └── user-list.comComponent.ts // Файл javascript ├── Tooltip.directive.spec.ts // Тестовый файл └── Tooltip.directive.ts // Файл директив
Ну, вот Компонент я разместил на одном уровне с tooltip , в основном для облегчения управления. Конечно, это варьируется от человека к человеку, вы можете поместить его в папку общедоступных components .
Напишите компонент всплывающей подсказки
в html файле:
<div class="caret"></div>
<div class="tooltip-content">{{data.content}}</div> В файле стиля .scss есть:
$black: #000000;
$white: #ffffff;
$caret-size: 6 пикселей;
$tooltip-bg: прозрачность($черный, 0.25); // прозрачность — это синтаксис sass $grid-gutter-width: 30px;
$body-bg-color: $white;
$app-anim-time: 200 мс;
$app-anim-curve: легкость;
$std-border-radius: 5px;
$zindex-макс: 100;
// :host селектор псевдокласса, устанавливает стиль самого элемента компонента: хост {
положение: фиксированное;
дополнение: $grid-gutter-width/3 $grid-gutter-width/2;
цвет фона: $tooltip-bg;
цвет: $body-bg-color;
непрозрачность: 0;
переход: все $app-anim-time $app-anim-curve;
выравнивание текста: по центру;
граница-радиус: $ std-border-radius;
z-индекс: $zindex-max;
}
.caret { // ширина каретки: 0;
высота: 0;
левая граница: 6 пикселей, сплошная прозрачная;
правая граница: 6 пикселей, сплошная прозрачная;
нижняя граница: сплошная 6 пикселей $tooltip-bg;
позиция: абсолютная;
верх: -$caret-size;
осталось: 50%;
поле слева: -$caret-size/2;
цвет нижней границы: $tooltip-bg;
} Хм~,
css— волшебная вещь, и я подготовлю статью, чтобы объяснить контент, связанный сsass...
Тогда содержимое javascript tooltip.component.ts будет следующим:
import {
Компонент,
ElementRef, //Элемент указывает на HostBinding,
OnDestroy,
OnInit
} из '@angular/core';
@Компонент({
selector: 'app-tooltip', // Идентификатор, указывающий, как называется мой компонент, вот app-tooltip
templateUrl: './tooltip.comComponent.html', // Скелет этого компонента styleUrls: ['./tooltip.comComponent.scss'] // Частный стиль этого компонента})
класс экспорта TooltipComponent реализует OnInit {
public data: Any; // Присвойте значение директиве Private displayTimeOut: Any;
// Декоратор, связанный с привязкой хоста самого компонента @HostBinding('style.top') hostStyleTop!: string;
@HostBinding('style.left') hostStyleLeft!: string;
@HostBinding('style.opacity') hostStyleOpacity!: string;
конструктор(
частный элементRef: ElementRef
) { }
ngOnInit(): пустота {
this.hostStyleTop = this.data.elementPosition.bottom + 'px';
если (this.displayTimeOut) {
ClearTimeout(this.displayTimeOut)
}
this.displayTimeOut = setTimeout((_: любой) => {
// Здесь вычисляем расстояние между всплывающей подсказкой и левой стороной. Формула расчета здесь: Tooltip.left + .width целевого элемента - (tooltip.width/2).
this.hostStyleLeft = this.data.elementPosition.left + this.data.element.clientWidth/2 - this.elementRef.nativeElement.clientWidth/2 + 'px'
this.hostStyleOpacity = '1';
this.hostStyleTop = this.data.elementPosition.bottom + 10 + 'px'
}, 500)
}
// Компонент уничтожен ngOnDestroy() {
// После уничтожения компонента очищаем таймер, чтобы предотвратить утечку памяти if(this.displayTimeOut) {
ClearTimeout(this.displayTimeOut)
}
}
} Написание инструкций для всплывающих подсказок
является основной темой этой статьи. Я отмечу конкретные инструкции в коде.
Содержимое соответствующего файла tooltip.directive.ts следующее:
import {.
ApplicationRef, // Обнаружение глобального вызова ComponentFactoryResolver, // Создание объекта компонента ComponentRef, // Ассоциация и руководство экземпляра компонента, указывающее на элемент, созданный директивой ComponentFactory, ElementRef,
EmbeddedViewRef, // EmbeddedViewRef наследует от ViewRef и используется для представления элементов пользовательского интерфейса, определенных в элементах шаблона.
HostListener, // Прослушивание событий DOM, Инжектор, // Ввод зависимостей
} из '@angular/core';
импортировать { TooltipComponent } из './tooltip/tooltip.comComponent';
@Директива({
селектор: '[appTooltip]'
})
класс экспорта TooltipDirective {
@Input("appTooltip") appTooltip!: string;
частный компонентRef!: ComponentRef<TooltipComponent>;
// Получаем относительное положение целевого элемента, например слева, справа, сверху, снизу
получить элементPosition() {
вернуть this.elementRef.nativeElement.getBoundingClientRect();
}
конструктор(
защищенный elementRef: ElementRef,
защищенное приложениеRef: ApplicationRef,
защищенный компонентFactoryResolver: ComponentFactoryResolver,
защищенный инжектор: Инжектор
) { }
//Создаем подсказку
защищенный createTooltip() {
this.comComponentRef = this.comComponentFactoryResolver
.resolveComponentFactory(TooltipComponent) // Привязка всплывающей подсказки компонент.create(this.injector);
this.comComponentRef.instance.data = { // Привязка содержимого данных данных: this.appTooltip,
элемент: this.elementRef.nativeElement,
elementPosition: this.elementPosition
}
this.appRef.attachView(this.comComponentRef.hostView); //Добавляем представление const domElem = (this.comComponentRef.hostView as EmbeddedViewRef<any>).rootNodes[0] as HTMLElement;
document.body.appendChild(domElem);
}
// Удалить подсказку
защищенный уничтожитьTooltip() {
если (this.comComponentRef) {
this.appRef.detachView(this.comComponentRef.hostView // Удаляем представление this.comComponentRef.destroy();
}
}
// Прослушиваем движение мыши в @HostListener('mouseover')
ПриВвод() {
this.createTooltip();
}
// Слушаем движение мыши out@HostListener('mouseout')
OnOut() {
this.destroyTooltip();
}
} На этом этапе 99% функций выполнены. Теперь мы можем вызывать их на странице.
На странице мы вызываем
нас, чтобы добавить в user-list.component.html следующий контент:
<p style="margin-top: 100px;">
<!-- [appTooltip]="'Привет, Джимми'" — это ключевой момент-->
<диапазон
[appTooltip]="'Привет, Джимми'"
style="margin-left: 200 пикселей; ширина: 160 пикселей; выравнивание текста: по центру; отступ: 20 пикселей 0; отображение: встроенный блок; граница: 1 пиксель сплошной #999;"
>Джимми</span>
</p> Мы объявили инструкцию TooltipDirective в app.module.ts и можем вызывать ее напрямую. Текущий эффект следующий:

Реализованная нами tooltip отображается внизу по центру, и это то, что мы обычно используем в фреймворке, например bottom атрибут всплывающей tooltip в angular ant design . По остальным атрибутам, если читателям интересно, их можно расширить.
На этом этапе мы вполне можем поддерживать написанные нами файлы инструкций.