แฮชแท็ก Angular 2 ในเทมเพลตหมายถึงอะไร


139

ฉันกำลังทำงานกับ angular 2 และฉันพบบางอย่างเช่น

<input #searchBox (keyup)="search(searchBox.value)"

และใช้งานได้

แต่ผมไม่เข้าใจความหมายของ#searchBox ฉันไม่พบสิ่งใดที่ชัดเจนทั้งในเอกสาร

ใครช่วยอธิบายให้ฉันฟังหน่อยได้ไหมว่ามันทำงานอย่างไร


2
อาจซ้ำกันได้ความแตกต่างระหว่างวงเล็บวงเล็บและเครื่องหมายดอกจันใน Angular2 คืออะไร - " ในองค์ประกอบ DOM <div #mydiv> การอ้างอิงถึงองค์ประกอบ " กล่าวอีกนัยหนึ่งการมี#searchBoxองค์ประกอบคือสิ่งที่ช่วยให้คุณใช้searchBox.valueในตัวจัดการการกดปุ่ม
Joe Clay

มันเป็นตัวแปร
Harry

คำตอบ:


183

เป็นไวยากรณ์ที่ใช้ในระบบเทมเพลต Angular 2 ซึ่งประกาศองค์ประกอบ DOM เป็นตัวแปร

ฉันให้ URL เทมเพลตองค์ประกอบของฉันที่นี่:

import {Component} from 'angular2/core';

@Component({
   selector: 'harrys-app',
   templateUrl: 'components/harry/helloworld.component.html'
})

export class HarrysApp {}

เทมเพลตแสดงผล HTML ในเทมเพลตคุณสามารถใช้ข้อมูลการผูกคุณสมบัติและการผูกเหตุการณ์ สิ่งนี้ทำได้ด้วยไวยากรณ์ต่อไปนี้:

# - การประกาศตัวแปร

() - การผูกเหตุการณ์

[] - ทรัพย์สินที่มีผลผูกพัน

[()] - การผูกทรัพย์สินสองทาง

{{ }} - การแก้ไข

* - คำสั่งโครงสร้าง

#ไวยากรณ์สามารถประกาศชื่อตัวแปรท้องถิ่นซึ่งอ้างอิง DOM วัตถุในแม่แบบ เช่น

 <span [hidden]="harry.value">*</span>
 <input type="text" #harry>
 {{ harry.value }}

6
ตัวอย่างการทำงาน: <input #bla style="display: none;" value="Foo" /<div> {{bla.value}} </div>. Foo จะแสดงใน div
บรอดแบนด์

3
และไม่มีทางที่การประกาศตัวแปรนั้นจะเป็นตัวแปร? ฉันกำลังพยายามสร้างรายการเมนูวัสดุจากวัตถุที่ซ้อนกันของเมนูที่ซับซ้อนและสิ่งนี้ทำให้ฉันรู้สึกแย่ ดูเหมือนจะสร้างตัวแปร dom แบบไดนามิกไม่ได้ พวกเขาจำเป็นต้องฮาร์ดโค้ดในโดมหรือไม่?
crowmagnumb

3
เอกสารราชการอ้างอิง: angular.io/guide/…
千木郷

องค์ประกอบหนึ่งสามารถมีการประกาศตัวแปรแฮชแท็กมากกว่าหนึ่งรายการได้หรือไม่
Kyle Vassella


36

จากangulartraining.com :

ตัวแปรอ้างอิงเทมเพลตเป็นอัญมณีเล็ก ๆ ที่ช่วยให้ทำสิ่งดีๆมากมายด้วย Angular ฉันมักจะเรียกคุณลักษณะนั้นว่า "ไวยากรณ์ของแฮชแท็ก" เพราะมันต้องอาศัยแฮชแท็กง่ายๆในการสร้างการอ้างอิงถึงองค์ประกอบในเทมเพลต:

<input #phone placeholder="phone number">

สิ่งที่ไวยากรณ์ข้างต้นทำได้ค่อนข้างง่าย: มันสร้างการอ้างอิงถึง  องค์ประกอบอินพุตที่สามารถใช้ในภายหลังในเทมเพลตของฉัน โปรดทราบว่าขอบเขตสำหรับตัวแปรนี้คือเทมเพลต HTML ทั้งหมดที่มีการกำหนดข้อมูลอ้างอิง

นี่คือวิธีที่ฉันสามารถใช้การอ้างอิงเพื่อรับค่าของอินพุตตัวอย่างเช่น:

<!-- phone refers to the input element --> 
<button (click)="callPhone(phone.value)">Call</button>

โปรดทราบว่า  โทรศัพท์  หมายถึง  HtmlElementตัวอย่างวัตถุสำหรับ  การป้อนข้อมูล เป็นผลให้  โทรศัพท์  มีคุณสมบัติและวิธีการทั้งหมดของ HTMLElement (id, ชื่อ, innerHTML, ค่า ฯลฯ )

ข้างต้นเป็นวิธีที่ดีในการหลีกเลี่ยงการใช้ ngModel หรือการผูกข้อมูลประเภทอื่น ๆ ในรูปแบบง่ายๆที่ไม่ต้องการการตรวจสอบความถูกต้องมากนัก


สิ่งนี้ใช้ได้กับส่วนประกอบหรือไม่

คำตอบคือใช่!

... ส่วนที่ดีที่สุดคือเราได้รับการอ้างอิงถึงอินสแตนซ์ส่วนประกอบจริง HelloWorldComponent ดังนั้นเราจึงสามารถเข้าถึงเมธอดหรือคุณสมบัติของส่วนประกอบนั้น ๆ ได้ (แม้ว่าจะประกาศว่าเป็นส่วนตัวหรือได้รับการปกป้องก็ตามซึ่งน่าแปลกใจ) :

@Component({
  selector: 'app-hello',
  // ...

export class HelloComponent {
   name = 'Angular';
}

[... ]

<app-hello #helloComp></app-hello>

<!-- The following expression displays "Angular" -->
{{helloComp.name}}

2
"แม้ว่าจะมีการประกาศว่าเป็นส่วนตัวหรือได้รับการปกป้องก็ตามซึ่งเป็นเรื่องที่น่าแปลกใจ" - โปรดทราบว่าตัวระบุการเข้าถึงเป็นตัวป้องกันเวลาคอมไพล์และโดยปกติจะไม่ทำอะไรเลยหลังจากที่รวบรวมและเรียกใช้โค้ดแล้ว
Tongfa

23

มันสร้างตัวแปรเทมเพลตที่อ้างอิง

  • inputองค์ประกอบถ้าองค์ประกอบเป็นองค์ประกอบ DOM ธรรมดา
  • ส่วนประกอบหรืออินสแตนซ์คำสั่งหากเป็นองค์ประกอบที่มีส่วนประกอบหรือคำสั่ง
  • ส่วนประกอบหรือคำสั่งเฉพาะบางอย่างหากใช้เช่น#foo="bar"เมื่อbarใด
@Directive({ // or @Component
  ...
  exportAs: 'bar'
})

ตัวแปรเทมเพลตดังกล่าวสามารถอ้างอิงได้ในการเชื่อมโยงเทมเพลตหรือในแบบสอบถามองค์ประกอบเช่น

@ViewChild('searchBox') searchBox:HTMLInputElement;

นี่มันอัศจรรย์มาก. ยังไงก็ตาม - มันค่อนข้างคล้ายกับ ngModel ใช่มั้ย?
ผู้ใช้ใจดี

ไม่จริง. ngModelมีไว้สำหรับการรวมแบบฟอร์ม คุณสามารถทำเช่นชนิดอื่น ๆ ngModelของการผูกโดยไม่ต้อง
GünterZöchbauer

ประการสุดท้ายคุณใช้ngAfterViewInitโดยไม่นำเข้าจริงได้อย่างไร? และการดำเนินการ? มันเป็นคุณสมบัติที่สร้างขึ้นใน plunker?
ผู้ใช้ใจดี

ไม่ Angular ไม่ได้ขึ้นอยู่กับอินเทอร์เฟซวงจรชีวิตที่ประกาศอย่างชัดเจน หากมีวิธีการอยู่จะถูกเรียก การใช้อินเทอร์เฟซอย่างชัดเจนถือเป็นแนวทางปฏิบัติที่ดี
GünterZöchbauer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.