
ในบทความก่อนหน้านี้ เราได้ให้ภาพรวมของ Angular แล้ว ในส่วนของคำสั่งแบบกำหนดเองนั้น เราสามารถเขียนคำสั่งเหล่านั้นได้ แต่ในสถานการณ์จริง เรายังต้องมีการจัดการที่เป็นมาตรฐาน
Angular เป็นเวอร์ชันอัปเกรดของ Angular.js [บทช่วยสอนที่เกี่ยวข้องที่แนะนำ: "บทช่วยสอนเชิงมุม"]
ดังนั้น ในบทความนี้ เราจะใช้ Tooltip เพื่ออธิบายเนื้อหาของคำแนะนำที่กำหนดเอง
การเรนเดอร์ออนไลน์ดังต่อไปนี้:

โครงสร้างไดเร็กทอรี
ขึ้นอยู่กับโครงการโค้ดที่ใช้ในบทความก่อนหน้านี้ ดำเนินการบรรทัดคำสั่ง:
# ป้อนคำสั่งโฟลเดอร์ $ cd #สร้างโฟลเดอร์คำแนะนำเครื่องมือ$ mkdir tooltip # เข้าสู่โฟลเดอร์คำแนะนำเครื่องมือ $ cd tooltip # สร้างส่วนประกอบคำแนะนำเครื่องมือ $ ng สร้างคำแนะนำเครื่องมือส่วนประกอบ # สร้างคำสั่งคำแนะนำเครื่องมือ $ ng สร้างคำแนะนำเครื่องมือคำสั่ง
หลังจากดำเนินการบรรทัดคำสั่งข้างต้น คุณจะได้รับโครงสร้างไดเร็กทอรีไฟล์ของ app/directive/tooltip ดังนี้:
คำแนะนำเครื่องมือ ├── tooltip // ส่วนประกอบคำแนะนำเครื่องมือ │ ├── user-list.component.html // โครงกระดูกของหน้า │ ├── user-list.component.scss // ลักษณะเฉพาะของหน้า │ ├── user-list.component .ts // ไฟล์ทดสอบ │ └── user-list.component.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;
$สีขาว: #ffffff;
$caret ขนาด: 6px;
$tooltip-bg: transparentize($black, 0.25); // transparentize เป็นไวยากรณ์ของ sass $grid-gutter-width: 30px;
$body-bg-สี: $white;
$app-anim-time: 200ms;
$ app-anim-curve: คลายออก;
$std-เส้นขอบรัศมี: 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-สูงสุด;
-
.caret { // ความกว้างคาเร็ต: 0;
ความสูง: 0;
ขอบซ้าย: โปร่งใสทึบ 6px;
เส้นขอบขวา: โปร่งใสทึบ 6px;
ขอบล่าง: 6px solid $tooltip-bg;
ตำแหน่ง: แน่นอน;
ด้านบน: -$caret ขนาด;
ซ้าย: 50%;
ขอบซ้าย: -$caret-size/2;
ขอบล่างสี: $tooltip-bg;
} อืม~
cssเป็นสิ่งมหัศจรรย์ และฉันจะจัดเรียงบทความเพื่ออธิบายเนื้อหาที่เกี่ยวข้องกับsass...
จากนั้น เนื้อหาของไฟล์ javascript tooltip.component.ts จะเป็นดังนี้:
import {
ส่วนประกอบ,
ElementRef //องค์ประกอบชี้ไปที่ HostBinding
ออนทำลาย,
OnInit
} จาก '@เชิงมุม/แกน';
@ส่วนประกอบ({
ตัวเลือก: 'app-tooltip', // Identifier ระบุว่าส่วนประกอบของฉันเรียกว่าอะไร นี่คือ app-tooltip
templateUrl: './tooltip.component.html', // โครงสร้างของ styleUrls ของคอมโพเนนต์นี้: ['./tooltip.component.scss'] // สไตล์ส่วนตัวของคอมโพเนนต์นี้})
คลาสส่งออก TooltipComponent ใช้ OnInit {
ข้อมูลสาธารณะ: ใด ๆ; // กำหนดค่าให้กับคำสั่ง displayTimeOut ส่วนตัว: ใด ๆ;
// มัณฑนากรที่เกี่ยวข้องกับการเชื่อมโยงโฮสต์ของส่วนประกอบเอง @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() {
// หลังจากที่ส่วนประกอบถูกทำลาย ให้ล้างตัวจับเวลาเพื่อป้องกันหน่วยความจำรั่วถ้า (this.displayTimeOut) {
clearTimeout (this.displayTimeOut)
-
-
} การเขียนคำแนะนำคำแนะนำเครื่องมือ
เป็นจุดสำคัญของบทความนี้ ฉันจะทำเครื่องหมายคำแนะนำเฉพาะบนโค้ด ~
เนื้อหาของไฟล์ tooltip.directive.ts มีดังนี้:
import {
ApplicationRef, // การตรวจจับการโทรทั่วโลก ComponentFactoryResolver, // สร้างวัตถุส่วนประกอบ ComponentRef, // การเชื่อมโยงและคำแนะนำของอินสแตนซ์ส่วนประกอบ, ชี้ไปที่องค์ประกอบที่สร้างโดย ComponentFactory Directive, ElementRef,
EmbeddedViewRef, // EmbeddedViewRef สืบทอดมาจาก ViewRef และใช้เพื่อแสดงองค์ประกอบ UI ที่กำหนดไว้ในองค์ประกอบเทมเพลต
HostListener, // เหตุการณ์ DOM กำลังฟังหัวฉีด, // อินพุตการฉีดการพึ่งพา
} จาก '@เชิงมุม/แกน';
นำเข้า { TooltipComponent } จาก './tooltip/tooltip.component';
@คำสั่ง({
ตัวเลือก: '[คำแนะนำเครื่องมือแอป]'
-
ส่งออกคำแนะนำเครื่องมือคลาส {
@Input("appTooltip") appTooltip!: string;
องค์ประกอบส่วนตัว Ref!: ComponentRef <TooltipComponent>;
// รับตำแหน่งสัมพัทธ์ขององค์ประกอบเป้าหมาย เช่น ซ้าย ขวา บน ล่าง
รับ elementPosition() {
ส่งคืน this.elementRef.nativeElement.getBoundingClientRect();
-
ตัวสร้าง (
ป้องกัน elementRef: ElementRef,
appRef ที่มีการป้องกัน: ApplicationRef,
ป้องกันส่วนประกอบFactoryResolver: ComponentFactoryResolver,
หัวฉีดที่ได้รับการป้องกัน: หัวฉีด
-
//สร้างคำแนะนำเครื่องมือ
ป้องกัน createTooltip() {
this.componentRef = this.componentFactoryResolver
.resolveComponentFactory(TooltipComponent) // ผูกคำแนะนำเครื่องมือcomponent.create(this.injector);
this.componentRef.instance.data = { // ผูกเนื้อหาข้อมูลข้อมูล: this.appTooltip,
องค์ประกอบ: this.elementRef.nativeElement
elementPosition: this.elementPosition
-
this.appRef.attachView(this.componentRef.hostView); //เพิ่มมุมมอง const domElem = (this.componentRef.hostView เป็น EmbeddedViewRef<any>).rootNodes[0] เป็น HTMLElement;
document.body.appendChild(domElem);
-
// ลบคำแนะนำเครื่องมือ
ป้องกัน destroyTooltip() {
ถ้า (this.componentRef) {
this.appRef.detachView(this.componentRef.hostView); // ลบมุมมอง this.componentRef.destroy();
-
-
// ฟังการเคลื่อนไหวของเมาส์ไปที่ @HostListener('mouseover')
OnEnter() {
this.createTooltip();
-
// ฟังการเคลื่อนไหวของเมาส์ out@HostListener('mouseout')
เปิดออก() {
this.destroyTooltip();
-
} ณ จุดนี้ 99% ของฟังก์ชั่นเสร็จสมบูรณ์แล้ว ตอนนี้เราสามารถเรียกมันได้บนหน้า
ในหน้านี้ เราโทรหา
เราเพื่อเพิ่มเนื้อหาต่อไปนี้ใน user-list.component.html :
<p style="margin-top: 100px;">
<!-- [appTooltip]="'Hello Jimmy'" คือประเด็นสำคัญ-->
<ช่วง
[appTooltip]="'สวัสดีจิมมี่'"
style="margin-left: 200px; width: 160px; text-align: center; padding: 20px 0; display: inline-block; border: 1px solid #999;"
>จิมมี่</span>
</p> เราได้ประกาศคำสั่ง TooltipDirective บน app.module.ts และเราสามารถเรียกมันได้โดยตรง ผลกระทบในปัจจุบันมีดังนี้:

tooltip ที่เรานำไปใช้จะแสดงที่กึ่งกลางด้านล่าง ซึ่งเป็นสิ่งที่เรามักจะใช้เฟรมเวิร์ก เช่น คุณลักษณะ bottom ของ tooltip ใน angular ant design สำหรับคุณลักษณะอื่นๆ หากผู้อ่านสนใจก็สามารถขยายได้
ณ จุดนี้ เราสามารถรักษาไฟล์คำสั่งที่เราเขียนไว้ได้เป็นอย่างดี