
@Component Decorator1.1 วัตถุประสงค์ของ @Component Decorator
เมื่อประกาศส่วนประกอบ ต้องใช้ @Component มัณฑนากรในคลาสส่วนประกอบเพื่อบอก Angular ว่านี่คือส่วนประกอบ [คำแนะนำบทช่วยสอนที่เกี่ยวข้อง: "บทช่วยสอนเชิงมุม"]
นำเข้า { ส่วนประกอบ, OnInit } จาก '@ เชิงมุม/core';
@ส่วนประกอบ({
ตัวเลือก: 'การแจ้งเตือนผลิตภัณฑ์แอป',
templateUrl: './product-alerts.component.html',
styleUrls: ['./product-alerts.component.css']
-
คลาสส่งออก ProductAlertsComponent ใช้ OnInit {
ตัวสร้าง () { }
ngOnInit() {
-
} 1.2 ตัวเลือกทั่วไปของ @Component มัณฑนากร
@Component มัณฑนากรสืบทอดมาจาก Directive ตัวเลือก css นี้ใช้เพื่อทำเครื่องหมายคำสั่งในเทมเพลตและทริกเกอร์การสร้างอินสแตนซ์ของคำสั่ง
1.2.1继承自@Directive装饰器的选项
| ประเภท | คำอธิบาย | ตัวเลือก | สตริง
|---|---|---|
| ชื่อ | ตัวเลือกcss | ใช้เพื่อทำเครื่องหมายคำสั่ง (ส่วนประกอบ) ในเทมเพลตและทริกเกอร์สตริงอินพุตการสร้างอินสแตนซ์ |
| [ | ] | Angular จะดำเนินการโดยอัตโนมัติระหว่างการตรวจจับการเปลี่ยนแปลง อัปเดตคุณสมบัติอินพุต แอตทริบิวต์อินพุตกำหนดชุดของรายการการกำหนดค่าที่ชี้จาก directiveProperty ไปยัง BindingProperty: · directiveProperty ใช้เพื่อระบุคุณสมบัติภายในคำสั่งที่จะเขียนค่า · BindingProperty ใช้เพื่อระบุคุณสมบัติ DOM ที่จะใช้อ่านค่า เมื่อไม่ได้ระบุbindingProperty จะถือว่าเหมือนกับ directiveProperty |
| สตริง | เอาต์พุต | []ชุดของคุณสมบัติเอาต์พุตสำหรับการผูกเหตุการณ์ เมื่อคุณสมบัติเอาต์พุตส่งเสียงเหตุการณ์ ตัวจัดการในเทมเพลตที่แนบมากับเหตุการณ์จะถูกเรียก คุณสมบัติเอาต์พุตแต่ละรายการจะแมป directiveProperty กับbindingProperty: · directiveProperty ระบุคุณสมบัติของส่วนประกอบที่จะปล่อยเหตุการณ์ · BindingProperty ระบุแอตทริบิวต์ HTML ที่จะแนบตัวจัดการเหตุการณ์ |
| ให้ | ผู้ให้บริการ[] | ชุดของผู้ให้บริการ |
| ส่งออกเป็น | สตริง ชื่อตั้งแต่ | หนึ่งชื่อขึ้นไปที่สามารถใช้เพื่อกำหนดคำสั่งนี้ให้กับตัวแปรในเทมเพลต เมื่อมีหลายชื่อ ให้คั่นด้วยเครื่องหมายจุลภาค |
| แบบสอบถาม | {[key:string]:any} | กำหนดค่าแบบสอบถามบางส่วนที่จะถูกแทรกลงในคำสั่งนี้ แบบสอบถามเนื้อหาได้รับการตั้งค่าก่อนที่จะเรียกการเรียกกลับ ngAfterContentInit แบบสอบถามมุมมองจะถูกตั้งค่าก่อนที่จะเรียกการเรียกกลับ ngAfterViewInit |
| jit | true | หากเป็นจริง คำสั่ง/ส่วนประกอบจะถูกละเว้นโดยคอมไพเลอร์ AOT ดังนั้นคอมไพเลอร์ AOT จะถูกคอมไพล์เสมอ ตัวเลือกนี้มีไว้เพื่อรองรับคอมไพเลอร์ Ivy ในอนาคตและยังไม่มีผลใดๆ |
| โฮสต์ | {[key:string]:string} | ใช้ชุดคู่คีย์-ค่าเพื่อแมปคุณสมบัติของคลาสกับการเชื่อมโยงองค์ประกอบโฮสต์ (คุณสมบัติ แอตทริบิวต์ และเหตุการณ์) เชิงมุมจะตรวจสอบการเชื่อมโยงทรัพย์สินโฮสต์โดยอัตโนมัติระหว่างการตรวจจับการเปลี่ยนแปลง หากค่าที่ถูกผูกไว้มีการเปลี่ยนแปลง Angular จะอัพเดตองค์ประกอบโฮสต์ของคำสั่ง เมื่อคีย์เป็นคุณสมบัติขององค์ประกอบโฮสต์ ค่าคุณสมบัติจะถูกเผยแพร่ไปยังแอตทริบิวต์ DOM ที่ระบุ เมื่อคีย์เป็นแอตทริบิวต์คงที่ใน DOM ค่าแอตทริบิวต์จะถูกเผยแพร่ไปยังคุณสมบัติที่ระบุในองค์ประกอบโฮสต์ สำหรับการจัดการเหตุการณ์: · สิ่งสำคัญคือเหตุการณ์ DOM ที่คำสั่งต้องการฟัง หากต้องการฟังกิจกรรมระดับโลก ให้เพิ่มเป้าหมายที่คุณต้องการฟังหน้าชื่อกิจกรรม เป้าหมายอาจเป็นหน้าต่าง เอกสาร หรือเนื้อหา · ค่าของมันคือคำสั่งที่จะดำเนินการเมื่อมีเหตุการณ์เกิดขึ้น หากคำสั่งนี้ส่งกลับค่าเท็จ ฟังก์ชัน PreventDefault ของเหตุการณ์ DOM นี้จะถูกเรียก ตัวแปรโลคัล $event สามารถอ้างอิงได้ในคำสั่งนี้เพื่อรับข้อมูลเหตุการณ์ |
1.2.2 @Component自己特有的选项
| คำอธิบาย | ประเภท | ตัวเลือก | |
|---|---|---|---|
| changeDetection | ChangeDetectionStrategy | เมื่อส่วนประกอบถูกสร้างอินสแตนซ์ Angular จะสร้างตัวตรวจจับการเปลี่ยนแปลงซึ่งรับผิดชอบในการแพร่กระจายการเปลี่ยนแปลงในแต่ละค่าการเชื่อมโยงของส่วนประกอบ นโยบายเป็นหนึ่งในค่าต่อไปนี้: · ChangeDetectionStrategy#OnPush(0) กำหนดกลยุทธ์เป็น CheckOnce (ตามความต้องการ) · ChangeDetectionStrategy#Default(1) ตั้งค่ากลยุทธ์เป็น CheckAlways | |
| viewProviders | Provider[] | กำหนดชุดของอ็อบเจ็กต์แบบฉีดที่มีอยู่ในแต่ละโหนดลูกของมุมมอง สตริง | |
| moduleId | มี | ID ของโมดูลที่มีส่วนประกอบ ส่วนประกอบจะต้องสามารถแก้ไข URL ที่เกี่ยวข้องที่ใช้ในเทมเพลตและสไตล์ชีตได้ SystemJS ส่งออกตัวแปร __moduleName ในทุกโมดูล ใน CommonJS สามารถตั้งค่าเป็น module.id | |
| templateUrl | stringURL | ของไฟล์เทมเพลตส่วนประกอบ หากมีให้ไว้ อย่าใช้เทมเพลตเพื่อจัดเตรียมเทมเพลตแบบอินไลน์ | |
| เทมเพลตแบบอินไลน์ของ | องค์ประกอบสตริง | เทมเพลต | หากมีการระบุไว้ อย่าใช้ templateUrl เพื่อระบุเทมเพลต |
| styleUrls | string[] | URL หนึ่งรายการขึ้นไป ซึ่งชี้ไปยังไฟล์ที่มีสไตล์ชีต CSS ของส่วนประกอบนี้ | |
| สตริง | สไตล์ | []สไตล์ CSS แบบอินไลน์ตั้งแต่หนึ่งรายการขึ้นไปที่ใช้โดยคอมโพเนนต์นี้ | |
| ภาพเคลื่อนไหว | ใด ๆ[] | การเรียกใช้ทริกเกอร์ () ภาพเคลื่อนไหวอย่างน้อยหนึ่งรายการ ซึ่งมีคำจำกัดความ state() และ transition() บางส่วน | |
| การห่อหุ้ม | ViewEncapsulation | เป็นกลยุทธ์การห่อหุ้มสไตล์ที่ใช้โดยเทมเพลตและสไตล์ CSS ค่าต่างๆ ได้แก่: · ViewEncapsulation.ShadowDom: ใช้ Shadow DOM ใช้งานได้เฉพาะบนแพลตฟอร์มที่รองรับ Shadow DOM โดยกำเนิด · ViewEncapsulation.Emulated: ใช้ CSS แบบชิมเมอร์เพื่อจำลองพฤติกรรมดั้งเดิม · ViewEncapsulation.None: ใช้ CSS ส่วนกลางโดยไม่มีการห่อหุ้มใดๆ หากไม่ได้ระบุ ค่าจะได้มาจาก CompilerOptions ตัวเลือกคอมไพเลอร์เริ่มต้นคือ ViewEncapsulation.Emulated หากตั้งค่านโยบายเป็น ViewEncapsulation.Emulated และคอมโพเนนต์ไม่ได้ระบุสไตล์หรือ styleUrls คอมโพเนนต์จะเปลี่ยนเป็น ViewEncapsulation.None โดยอัตโนมัติ | |
| การแก้ไข | [สตริง สตริง] | จะแทนที่ค่าเริ่มต้นและตัวคั่นสิ้นสุดของนิพจน์การแก้ไข ({ { และ }}) | |
| entryComponents | Array<Type | any[]> | |
| PreservWhitespaces | boolean | หากเป็นจริง ก็จะยังคงอยู่ หากเป็นเท็จ อักขระช่องว่างเพิ่มเติมที่เป็นไปได้จะถูกลบออกจากเทมเพลตที่คอมไพล์แล้ว อักขระช่องว่างคืออักขระที่ตรงกับ s ในนิพจน์ทั่วไปของ JavaScript ค่าเริ่มต้นเป็นเท็จเว้นแต่จะถูกแทนที่ผ่านตัวเลือกคอมไพเลอร์ |
selectorสามารถใช้หนึ่งในแบบฟอร์มต่อไปนี้:
element-name : เลือก[attribute] ตามชื่อองค์ประกอบ: เลือก.class ตามชื่อแอตทริบิวต์: เลือก [attribute=value] ตามชื่อคลาสnot(sub_selector) : เลือก selector1, selector2 เฉพาะเมื่อองค์ประกอบไม่ตรงกับตัวเลือกย่อย sub_selectorselector1, selector22.1 ถูกเลือกว่า selector1 หรือ selector2 ตรงกับ element-name : select
@Component({
ตัวเลือก: 'องค์ประกอบแอป',
แม่แบบ: './element.component.html',
styleUrls: ['./element.component.css']
}) <app-element></app-element>
2.2 [attribute] : เลือก
@Component({
ตัวเลือก: '[องค์ประกอบแอป]',
แม่แบบ: './element.component.html',
styleUrls: ['./element.component.css']
}) <div app-element></div>
2.3 .class : เลือก
@Component({
ตัวเลือก: '.app-element',
แม่แบบ: './element.component.html',
styleUrls: ['./element.component.css']
}) <div class="app-element"></div>
host : {[key:string]:string}ใช้ชุดของคู่คีย์-ค่าเพื่อแมปคุณสมบัติของคลาสกับการโยงของโฮสต์ องค์ประกอบ (คุณสมบัติ คุณสมบัติ และเหตุการณ์)
เชิงมุมจะตรวจสอบการเชื่อมโยงทรัพย์สินโฮสต์โดยอัตโนมัติระหว่างการตรวจจับการเปลี่ยนแปลง หากค่าที่ถูกผูกไว้มีการเปลี่ยนแปลง Angular จะอัพเดตองค์ประกอบโฮสต์ของคำสั่ง
คุณ
จะต้องเพิ่มเครื่องหมายคำพูดเดี่ยวหรือเครื่องหมาย3.1 attribute และ property
ความเหมือนและความแตกต่าง:
双向dom 的property ดังนั้นคำสั่งจึงผูกไว้กับคุณสมบัติ แต่ในบางกรณี dom ก็ไม่มีอยู่ เช่น colspan, rowspan เป็นต้น หากคุณต้องการผูกคุณสมบัติแท็ก html คุณต้องใช้ attr :
<table width="100%" border="10px ทึบ">
<tr>
<th>เดือน</th>
<th>การออม</th>
</tr>
<tr>
<td [attr.colspan]=colnum>มกราคม</td>
</tr>
<tr>
<td [attr.colspan]=colnum>กุมภาพันธ์</td>
</tr>
</ตาราง>
ให้ colnum:number = 2; 3.2 ใช้ host เพื่อผูก class
@Component({
ตัวเลือก: '.app-element',
แม่แบบ: './element.component.html',
styleUrls: ['./element.component.css'],
เจ้าภาพ: {
'[class.default-class]': 'useDefault'
-
encapsulation: ViewEncapsulation.None // ให้องค์ประกอบโฮสต์ใช้สไตล์ element.component.css ด้วย มิฉะนั้น ระบบจะใช้แคปซูลเป็นค่าเริ่มต้นเพื่อหลีกเลี่ยงมลภาวะของ CSS
-
ส่งออกคลาส AppElementComponent {
@อินพุต() useDefault = จริง;
} <div class="app-element"></div>
3.3 ใช้ style การเชื่อมโยง host
@Component({
ตัวเลือก: '.app-element',
แม่แบบ: './element.component.html',
styleUrls: ['./element.component.css'],
เจ้าภาพ: {
'[style.พื้นหลัง]': 'inputBackground'
-
-
ส่งออกคลาส AppElementComponent {
@Input() inputBackground = 'สีแดง';
} <div class="app-element"></div>
3.4 ใช้ host เพื่อผูกเหตุการณ์
@Component({
ตัวเลือก: '.app-element',
แม่แบบ: './element.component.html',
styleUrls: ['./element.component.css'],
เจ้าภาพ: {
'(คลิก)': 'onClick($กิจกรรม)'
-
-
ส่งออกคลาส AppElementComponent {
สาธารณะ onClick ($ กิจกรรม) {
console.log($เหตุการณ์);
-
} <div class="app-element"></div>
encapsulation (การห่อหุ้ม)กลยุทธ์การห่อหุ้มสไตล์สำหรับเทมเพลตและสไตล์ CSS
4.1 Web Components
ห่อหุ้มส่วนประกอบในลักษณะที่เป็นมาตรฐานและไม่ก้าวก่าย แต่ละส่วนประกอบสามารถจัดระเบียบโครงสร้าง HTML, สไตล์ CSS และโค้ด JavaScript ของตัวเองได้โดยไม่不会干扰องค์ประกอบอื่น ๆ บนเพจ
Web Components ประกอบด้วยสี่เทคโนโลยีต่อไปนี้:
4.2 Shadow DOM
<!DOCTYPE html>
<html>
<หัว>
<meta charset="UTF-8">
<title>เงา DOM</title>
<style type="text/css">
.shadowroot_son {
สี: #f00;
-
</สไตล์>
</หัว>
<ร่างกาย>
<p>ฉันไม่ได้อยู่ใน Shadow Host</p>
<div>สวัสดีชาวโลก!</div>
<สคริปต์>
// โฮสต์เงา
var shadowHost = document.querySelector('.shadowhost');
// สร้างรูทเงา (รูทเงา)
var shadowroot = shadowhost.createshadowroot ();
// รากของเงาคือโหนดแรกของแผนภูมิเงา และโหนดอื่นๆ เช่น โหนด p ก็คือโหนดย่อย
shadowRoot.innerHTML = '<p>ฉันอยู่ใน Shadow Host</p>';
</สคริปต์>
</ร่างกาย>
<html> 4.3 ViewEncapsulation
ViewEncapsulation อนุญาตให้ตั้งค่าทางเลือกได้สามค่า:
4.3.1 ViewEncapsulation.None
import { Component, ViewEncapsulation } จาก '@angular/core';
@ส่วนประกอบ({
ตัวเลือก: 'แอปของฉัน'
แม่แบบ: `
<h4>ยินดีต้อนรับสู่โลกเชิงมุม</h4>
<p class="greet">สวัสดี {{name}}</p>
-
สไตล์: [`
.ทักทาย {
ความเป็นมา: #369;
สี: ขาว;
-
-
การห่อหุ้ม: ViewEncapsulation.None // ไม่มี | . ShadowDom
-
ส่งออกคลาส AppComponent {
ชื่อ: string = 'Semlinker';
} ผลลัพธ์ของการตั้งค่า ViewEncapsulation.None คือไม่มี Shadow DOM และสไตล์ทั้งหมดจะถูกนำไปใช้กับ document整个กล่าวอีกนัยหนึ่ง สไตล์ของส่วนประกอบจะ受外界影响และอาจถูก覆盖
4.3.2 ViewEncapsulation.Emulated
นำเข้า { ส่วนประกอบ ViewEncapsulation } จาก '@ เชิงมุม/core';
@ส่วนประกอบ({
ตัวเลือก: 'แอปของฉัน'
-
การห่อหุ้ม: ViewEncapsulation.Emulated // ไม่มี | . ShadowDom
-
ส่งออกคลาส AppComponent {
ชื่อ: string = 'semlinker';
} ผลลัพธ์ของการตั้งค่า ViewEncapsulation.Emulated คือไม่มี Shadow DOM แต่ส่วนประกอบถูกห่อหุ้มผ่าน样式包装机制ที่ Angular มอบให้ เพื่อให้รูปแบบของส่วนประกอบ不受外部影响แม้ว่าสไตล์จะยังคงใช้กับ整个document แต่ Angular ก็สร้างตัวเลือก [_ngcontent-cmy-0] สำหรับคลาส. .greet จะเห็นได้ว่า为组件定义的样式,被Angular 修改了ในจำนวนนี้ _nghost-cmy- 和_ngcontent-cmy- ถูกนำมาใช้เพื่อ实现局部的样式
4.3.3 ViewEncapsulation.ShadowDom
นำเข้า { ส่วนประกอบ ViewEncapsulation } จาก '@ เชิงมุม/core';
@ส่วนประกอบ({
ตัวเลือก: 'แอปของฉัน'
-
encapsulation: Viewencapsulation.Shadowdom // None |
-
ส่งออกคลาส AppComponent {
ชื่อ: string = 'Semlinker';
} ผลลัพธ์ของการตั้งค่า ViewEncapsulation.ShadowDom คือการใช้คุณลักษณะ Shadow DOM ดั้งเดิม Angular จะ Shadow DOM 形式渲染ที่รองรับโดยเบราว์เซอร์