Cách tốt nhất để truy cập thành phần con là @ViewChild.
Giả sử bạn có AppMainComponent với một ChildComponent lồng nhau từ ví dụ của bạn.
// app-main.component.ts
import { Component } from '@angular/core';
@Component({
selector: 'app-main',
template: `
<child-component />
`
})
export class AppMainComponent {}
Bạn muốn gọi phương thức rõ ràng từ ChildComponent của bạn.
// child.component.ts
import { Component } from '@angular/core';
@Component({
selector: 'child-component',
template: '{{ greeting }}'
})
class ChildComponent {
greeting: String = 'Hello World!';
clear() {
this.greeting = null;
}
}
Bạn có thể thực hiện nó bằng cách import lớp ChildComponent, ViewChild trang trí và vượt qua lớp thành phần trong nó như là một truy vấn. Bằng cách này, bạn sẽ có quyền truy cập vào giao diện ChildComponent được lưu trữ trong biến tùy chỉnh.Dưới đây là ví dụ:
// app-main.component.ts
import { Component, ViewChild } from '@angular/core';
import { ChildComponent } from './components/child/child.component';
@Component({
selector: 'app-main',
template: `
<child-component />
`
})
class ChildComponent {
@ViewChild(ChildComponent)
child: ChildComponent;
clearChild() {
this.child.clear();
}
}
Lưu ý! Chế độ xem con sẽ chỉ khả dụng sau ngAfterViewInit.
Trả lời sau khi Góc khởi tạo chế độ xem của thành phần và chế độ xem con. Được gọi một lần sau lần đầu tiên ngAfterContentChecked(). Móc chỉ có thành phần.
Nếu bạn muốn thực thi phương pháp một cách tự động, bạn cần thực hiện nó bên trong móc vòng đời này.
Bạn cũng có thể nhận được QueryList thành phần con thông qua trang trí ViewChildren.
import { Component, ViewChildren, QueryList } from '@angular/core';
import { ChildComponent } from './components/child/child.component';
...
@ViewChildren(ChildComponent)
children: QueryList<ChildComponent>;
Danh sách truy vấn có thể rất hữu ích, ví dụ: bạn có thể đăng ký cho trẻ em thay đổi.
Cũng có thể tạo template reference variables và nhận quyền truy cập vào chúng thông qua trang trí ViewChild.
Tôi nghĩ cú pháp là' @ViewChild (ComponentName) con; 'và theo [tài liệu] (https://angular.io/docs/ts/latest/api/core/ViewChild-var.html) nó không có sẵn cho đến khi móc vòng đời 'ngAfterViewInit()'. –
Tôi đã thử nó. Khi một chuỗi được truyền, nó tra cứu các biến mẫu với tên này, nếu không một thành phần hoặc chỉ thị của kiểu được truyền. "Bộ chọn" trong tài liệu hơi gây hiểu nhầm. –
Cảm ơn bạn đã cập nhật. Tôi đã xem [mã nguồn cho ViewChild] (https://github.com/angular/angular/blob/2.0.0-beta.0/modules/angular2/src/core/metadata.ts#L1147-L1147), và nó nói "Hỗ trợ các tham số truy vấn giống như QueryMetadata, ngoại trừ con cháu." [QueryMetadata API doc] (https://angular.io/docs/ts/latest/api/core/QueryMetadata-class.html) giải thích tất cả các loại "bộ chọn" khác nhau được hỗ trợ. (Tìm công cụ này là một nỗi đau như vậy tại thời điểm này.) –