@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, selector2
2.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 形式渲染
ที่รองรับโดยเบราว์เซอร์