Cách sử dụng ViewChild trong Angular để truy cập thành phần trẻ em, chỉ thị hoặc phần tử DOM

Giới thiệu

Bài viết này sẽ giới thiệu cho bạn về góc ViewChild Trang trí.

Có thể có các tình huống mà bạn muốn truy cập một thành phần chỉ thị, trẻ em hoặc phần tử DOM từ một lớp thành phần cha. ViewChild Trang trí trả về phần tử đầu tiên phù hợp với một bộ chọn tham chiếu chỉ thị, thành phần hoặc mẫu nhất định.

Điều kiện tiên quyết

Nếu bạn muốn làm theo cùng với hướng dẫn này:

  • Cân nhắc cài đặt @ Angular / Cli .
  • Lệnh này sẽ tạo pup.component.ts , PUP.COMPONON.CSS , và PUP.component.html Tệp. Và thêm thành phần vào app.module.ts : @angular/cli to create a new project to test ViewChild functionality in.

Hướng dẫn này đã được xác minh bằng @ Angular / Core V13.0.2 và @ Angular / CLI < / a> v13.0.3. @angular/core v13.0.2 and @angular/cli v13.0.3.

Bây giờ, bạn có thể gọi whoami từ trong lớp Thành phần cha mẹ với ViewChild . Thay thế nội dung của app.component.ts với các mục sau: ViewChild Với Chỉ thị

Bây giờ, bạn có thể gọi whoami từ trong lớp Thành phần cha mẹ với ViewChild . Thay thế nội dung của app.component.ts với các mục sau: Làm cho nó có thể truy cập các chỉ thị.

Hãy nói rằng bạn có một sharkdirective . Chỉ thị này sẽ tìm kiếm các yếu tố với thuộc tính appShark and prepend the text in the element with the word "Shark".

Lý tưởng nhất là bạn sẽ sử dụng @ Angular / cli vào Tạo Chỉ thị của bạn: @angular/cli PUPCOMPONENT generate your directive:

Lệnh này sẽ tạo shark.directive.ts tập tin. Và thêm chỉ thị vào app.module.ts :

app.module.ts

nhập {sharkdirective} từ './shark.directive'; ... @Ngmodule [{ Tuyên bố: [ Appcomponent, sharkdirective ], ... }]

Sau đó, sử dụng ElementRef và renderer2 để viết lại chữ. Thay thế nội dung của Shark.Directive.ts Với những điều sau: ElementRef and Renderer2 to rewrite the text. Replace the contents of shark.directive.ts with the following:

shark.directive.ts

nhập khẩu { Chỉ thị, ElementRef, Renderer2. } Từ '@ góc / lõi'; @Directive [ {chọn: '[appshark]'} ] lớp xuất khẩu sharkdirective { Sinh vật = 'Cá heo'; Constructor [Elem: ElementRef, Renderer: renderer2] { hãy để shark = renderer.createtext ['cá mập']; renderer.appendchild [Elem.neativeelement, Shark]; Không Không

Tiếp theo, thêm Appshark Thuộc tính vào Span chứa văn bản trong mẫu thành phần. Thay thế nội dung của app.component.html với các mục sau: appShark attribute to a span containing text in the component template. Replace the contents of app.component.html with the following:

app.component.html

appShark>Fin!

Khi xem ứng dụng trong trình duyệt, nó sẽ hiển thị từ "Cá mập" Trước khi nội dung của phần tử:

Đầu ra
Shark Fin!

Bây giờ, bạn cũng có thể truy cập Sinh vật Biến thể hiện của SharkDirective và đặt ExtracTreature biến đối tượng với giá trị của nó. Thay thế nội dung của app.component.ts với các mục sau: whoami . SharkDirective and set an extraCreature instance variable with its value. Replace the contents of app.component.ts with the following:

app.component.ts

nhập khẩu { Thành phần, ViewChild, Sau đóViewinit } Từ '@ góc / lõi'; nhập {sharkdirective} từ './shark.directive'; @Thành phần[{ Bộ chọn: 'Ứng dụng gốc', templateurl: './app.component.html', styleurls: ['./app.component.css'] }] XUẤT KHẨU LỚP IMPCOMPONENT INDER ADVINGVIEWINIT { ExtracRegure !: Chuỗi; @Viewchild [sharkdirective] Đặt Appshark [Chỉ thị: SharkDirective] { this.extracreature = Chỉ thị.Creature; }; ngafterviewinit [] { Console.log [this.extracreate]; // Cá heo Không Không

Mã này đã sử dụng một setter để đặt ExtracTreature Biến. Lưu ý rằng nó đang chờ SUSTVIEVIEINIT Móc vòng đời để truy cập biến, vì đây là khi các thành phần và chỉ thị trẻ em có sẵn.

Khi xem ứng dụng trong trình duyệt, bạn vẫn sẽ thấy "Fin Shark!" tin nhắn. Tuy nhiên, trong nhật ký bảng điều khiển, nó sẽ hiển thị:

Đầu ra
Dolphin

Bây giờ, bạn cũng có thể truy cập Sinh vật Biến thể hiện của SharkDirective và đặt ExtracTreature biến đối tượng với giá trị của nó. Thay thế nội dung của app.component.ts với các mục sau:

nhập khẩu { ViewChild Với các yếu tố DOM

Thành phần, Làm cho nó có thể truy cập các phần tử DOM gốc có biến tham chiếu mẫu.

ViewChild, in the template with the #someInput reference variable. Replace the contents of app.component.html with the following:

app.component.html

Sau đóViewinit } Từ '@ góc / lõi';#someInput placeholder="Your favorite sea creature">

nhập {sharkdirective} từ './shark.directive'; with ViewChild and set the value. Replace the contents of app.component.ts with the following:

app.component.ts

@Thành phần[{ Bộ chọn: 'Ứng dụng gốc', templateurl: './app.component.html', styleurls: ['./app.component.css'] }] XUẤT KHẨU LỚP IMPCOMPONENT INDER ADVINGVIEWINIT { ExtracRegure !: Chuỗi; @Viewchild [sharkdirective] Đặt Appshark [Chỉ thị: SharkDirective] { this.extracreature = Chỉ thị.Creature; }; ngafterviewinit [] { Console.log [this.extracreate]; // Cá heo Không Không

Mã này đã sử dụng một setter để đặt ExtracTreature Biến. Lưu ý rằng nó đang chờ SUSTVIEVIEINIT Móc vòng đời để truy cập biến, vì đây là khi các thành phần và chỉ thị trẻ em có sẵn.

Đầu ra
Whale!

Bây giờ, bạn cũng có thể truy cập Sinh vật Biến thể hiện của SharkDirective và đặt ExtracTreature biến đối tượng với giá trị của nó. Thay thế nội dung của app.component.ts với các mục sau:

nhập khẩu { ViewChild Với các yếu tố DOM

Thành phần, Làm cho nó có thể truy cập các phần tử DOM gốc có biến tham chiếu mẫu.

ViewChild, PupComponent .

Sau đóViewinit@angular/cli to generate your component:

  • } Từ '@ góc / lõi'; nhập {sharkdirective} từ './shark.directive';

nhập khẩu {pup.component.ts, pup.component.css, and pup.component.html files. And adds the component to app.module.ts:

app.module.ts

@Thành phần[{ Bộ chọn: 'Ứng dụng gốc', templateurl: './app.component.html', styleurls: ['./app.component.css'] }] XUẤT KHẨU LỚP IMPCOMPONENT INDER ADVINGVIEWINIT { ExtracRegure !: Chuỗi; @Viewchild [sharkdirective] Đặt Appshark [Chỉ thị: SharkDirective] { ... @Ngmodule [{ Tuyên bố: [ Appcomponent, PUPCOMPONENT ], ... }] ..........

Sau đó, thêm whoami Phương thức để PupComponent Trả về một tin nhắn: whoAmI method to PupComponent which returns a message:

pup.component.ts

nhập {thành phần, oninit} từ '@ angular / lõi'; @Thành phần[{ Bộ chọn: 'app-pup', templateurl: './pup.component.html', styleurs: ['./pup/component.css'] }] Xuất khẩu lớp PUPComponent thực hiện OnInit { constructor[] { } ExtracTreature Biến. Lưu ý rằng nó đang chờ SUSTVIEVIEINIT Móc vòng đời để truy cập biến, vì đây là khi các thành phần và chỉ thị trẻ em có sẵn. Khi xem ứng dụng trong trình duyệt, bạn vẫn sẽ thấy "Fin Shark!" tin nhắn. Tuy nhiên, trong nhật ký bảng điều khiển, nó sẽ hiển thị: Thành phần cha mẹ đã có thể truy cập giá trị từ chỉ thị. Sử dụng ViewChild Với các yếu tố DOM ViewChild Làm cho nó có thể truy cập các phần tử DOM gốc có biến tham chiếu mẫu.

Tiếp theo, tham chiếu thành phần trẻ em trong mẫu ứng dụng. Thay thế nội dung của app.component.html với các mục sau:

app.component.html

pup hoạt động!

Bây giờ, bạn có thể gọi whoami từ trong lớp Thành phần cha mẹ với ViewChild . Thay thế nội dung của app.component.ts với các mục sau: whoAmI PUPCOMPONENT ViewChild. Replace the contents of app.component.ts with the following:

app.component.ts

nhập khẩu { Thành phần, ViewChild, Sau đóViewinit } Từ '@ góc / lõi'; nhập {pupcomponent} từ './pup.component'; @Thành phần[{ Bộ chọn: 'Ứng dụng gốc', templateurl: './app.component.html', styleurls: ['./app.component.css'], }] XUẤT KHẨU LỚP IMPCOMPONENT INDER ADVINGVIEWINIT { @ViewChild [Pupcomponent] PUP !: PUPCOMPONENT; ngafterviewinit [] { Console.log [this.pup.whoami []]; // Tôi là một thành phần PUP! Không Không

Khi xem ứng dụng trong trình duyệt, nhật ký bảng điều khiển sẽ hiển thị:

Đầu ra
I am a pup component!

Thành phần cha mẹ đã có thể gọi cho thành phần của trẻ em whoami .

Phần kết luận

Trong hướng dẫn này, bạn đã sử dụng ViewChild để truy cập một thành phần chỉ thị, trẻ em và phần tử DOM từ một lớp thành phần cha mẹ. . Làm cho nó có thể truy cập các phần tử DOM gốc có biến tham chiếu mẫu. to access a directive, child component, and a DOM element from a parent component class.

Nếu tham chiếu thay đổi một yếu tố mới một cách linh hoạt, ViewChild sẽ tự động cập nhật tham chiếu của nó.

Trong trường hợp bạn muốn truy cập nhiều trẻ em, bạn sẽ sử dụng ViewChildren thay thế.

Nếu bạn muốn tìm hiểu thêm về Angular, hãy xem trang chủ đề góc của chúng tôi để biết các bài tập và các dự án lập trình.

Video

Chủ Đề