Các hashtag Angular 2 trong mẫu có nghĩa là gì?


135

Tôi đang làm việc với góc 2 và tôi đã tìm thấy một cái gì đó như

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

Và nó hoạt động.

Tuy nhiên, tôi không hiểu ý nghĩa của #searchBox . Tôi không tìm thấy bất cứ điều gì rõ ràng trong tài liệu.

Bất cứ ai có thể giải thích cho tôi làm thế nào nó hoạt động?


2
Sự trùng lặp có thể có của sự khác biệt giữa dấu ngoặc đơn, dấu ngoặc và dấu sao trong Angular2 là gì? - " Trên phần tử DOM <div #mydiv> tham chiếu đến phần tử ". Nói cách khác, có #searchBoxtrên phần tử là những gì cho phép bạn sử dụng searchBox.valuetrong trình xử lý keyup.
Joe Clay

nó là một biến
Harry

Câu trả lời:


177

Cú pháp được sử dụng trong hệ thống tạo khuôn mẫu Angular 2 khai báo các phần tử DOM là các biến.

Ở đây tôi cung cấp cho thành phần của mình một URL mẫu:

import {Component} from 'angular2/core';

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

export class HarrysApp {}

Mẫu kết xuất HTML. Trong một mẫu bạn có thể sử dụng dữ liệu, ràng buộc thuộc tính và ràng buộc sự kiện. Điều này được thực hiện với cú pháp sau:

# - sự định nghĩa biến

() - ràng buộc sự kiện

[] - ràng buộc tài sản

[()] - ràng buộc tài sản hai chiều

{{ }} - nội suy

* - chỉ thị cấu trúc

Các #cú pháp có thể khai báo tên biến địa phương mà tham chiếu đối tượng DOM trong một mẫu. ví dụ

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

6
Ví dụ làm việc : <input #bla style="display: none;" value="Foo" /<div> {{bla.value}} </div>. Foo được hiển thị trong div.
băng thông rộng

3
Và không có cách nào để khai báo biến đó là một biến? Tôi đang cố gắng tạo các mục menu vật liệu từ một đối tượng phức tạp của các menu và điều này đã cản trở tôi. Tôi dường như không thể tự động tạo ra các biến dom. Họ có thực sự cần phải được mã hóa cứng trong dom?
crowmagnumb

2
Tài liệu tham khảo chính thức: angular.io/guide/ trộm
千 木


31

Từ angulartraining.com :

Các biến tham chiếu mẫu là một viên ngọc nhỏ cho phép có được nhiều thứ hay ho được thực hiện với Angular. Tôi thường gọi tính năng đó là cú pháp hashtag cú pháp bởi vì, tốt, nó dựa vào một hashtag đơn giản để tạo một tham chiếu đến một phần tử trong một mẫu:

<input #phone placeholder="phone number">

Những gì cú pháp trên thực hiện khá đơn giản: Nó tạo ra một tham chiếu đến  đầu vào phần tử có thể được sử dụng sau này trong mẫu của tôi. Lưu ý rằng phạm vi cho biến này là toàn bộ mẫu HTML trong đó tham chiếu được xác định.

Ví dụ, đây là cách tôi có thể sử dụng tham chiếu đó để lấy giá trị của đầu vào:

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

Lưu ý rằng  điện thoại  đề cập đến thể hiện  đối tượng HTMLE bổ sung cho  đầu vào . Kết quả là  điện thoại  có tất cả các thuộc tính và phương thức của bất kỳ HTMLEuity nào (id, name, InternalHTML, value, v.v.)

Trên đây là một cách hay để tránh sử dụng ngModel hoặc một số loại ràng buộc dữ liệu khác ở dạng đơn giản không đòi hỏi nhiều về mặt xác nhận.


Điều này cũng làm việc với các thành phần?

Câu trả lời là CÓ!

... phần hay nhất của nó là chúng tôi đang tham chiếu đến thể hiện thành phần thực tế, HelloWorldComponent, vì vậy chúng tôi có thể truy cập bất kỳ phương thức hoặc thuộc tính nào của thành phần đó (ngay cả khi chúng được khai báo là riêng tư hoặc được bảo vệ, điều đáng ngạc nhiên) :

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

export class HelloComponent {
   name = 'Angular';
}

[...]

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

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

2
"ngay cả khi chúng được khai báo là riêng tư hoặc được bảo vệ, thật đáng ngạc nhiên" - hãy nhớ rằng các bộ chỉ định truy cập là một trình bảo vệ thời gian biên dịch và thường không làm gì sau khi mã được biên dịch và chạy.
Tongfa

21

Nó tạo ra một biến mẫu tham chiếu

  • các input yếu tố nếu phần tử là một phần tử DOM đồng bằng
  • thành phần hoặc chỉ thị nếu nó là một thành phần có thành phần hoặc chỉ thị
  • một số thành phần cụ thể hoặc chỉ thị nếu nó được sử dụng như #foo="bar"khi bar
@Directive({ // or @Component
  ...
  exportAs: 'bar'
})

Một biến mẫu như vậy có thể được tham chiếu trong các ràng buộc mẫu hoặc trong các truy vấn phần tử như

@ViewChild('searchBox') searchBox:HTMLInputElement;

Thật đáng kinh ngạc. Nhân tiện - nó khá giống với ngModel, phải không?
người dùng tốt bụng

Không hẳn vậy. ngModellà để tích hợp các hình thức. Bạn có thể làm tất cả các loại ràng buộc khác mà không cần ngModel.
Günter Zöchbauer

Điều cuối cùng, làm thế nào bạn sử dụng ngAfterViewInitmà không thực sự nhập nó? Và thực hiện? Đó là một tính năng xây dựng trên plunker?
người dùng tốt bụng

Không, Angular không phụ thuộc vào giao diện vòng đời được khai báo rõ ràng. Nếu phương thức tồn tại, nó được gọi. Thực hiện các giao diện rõ ràng là thực hành tốt mặc dù.
Günter Zöchbauer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.