Thay vì tiêm ElementRef
và sử dụng querySelector
hoặc tương tự từ đó, một cách khai báo có thể được sử dụng thay thế để truy cập trực tiếp các phần tử trong chế độ xem:
<input #myname>
@ViewChild('myname') input;
thành phần
ngAfterViewInit() {
console.log(this.input.nativeElement.value);
}
Ví dụ về StackBlitz
- @ViewChild () hỗ trợ chỉ thị hoặc loại thành phần làm tham số hoặc tên (chuỗi) của biến mẫu.
- @ViewChildren () cũng hỗ trợ danh sách các tên dưới dạng danh sách được phân tách bằng dấu phẩy (hiện không có khoảng trắng được phép
@ViewChildren('var1,var2,var3')
).
- @ContentChild () và @ContentChildren () làm tương tự nhưng trong DOM ánh sáng (
<ng-content>
các phần tử được chiếu).
hậu duệ
@ContentChildren()
là người duy nhất cho phép truy vấn con cháu
@ContentChildren(SomeTypeOrVarName, {descendants: true}) someField;
{descendants: true}
phải là mặc định nhưng không phải là bản 2.0.0 cuối cùng và nó được coi là một lỗi
Điều này đã được sửa trong 2.0.1
đọc
Nếu có một thành phần và chỉ thị, read
tham số cho phép chỉ định trường hợp nào sẽ được trả về.
Ví dụ ViewContainerRef
, được yêu cầu bởi các thành phần được tạo động thay vì mặc địnhElementRef
@ViewChild('myname', { read: ViewContainerRef }) target;
đăng ký thay đổi
Mặc dù các khung nhìn con chỉ được đặt khi ngAfterViewInit()
được gọi và nội dung con chỉ được đặt khi ngAfterContentInit()
được gọi, nếu bạn muốn đăng ký thay đổi kết quả truy vấn, nên thực hiện trongngOnInit()
https://github.com/angular/angular/issues/9689#issuecomment-229247134
@ViewChildren(SomeType) viewChildren;
@ContentChildren(SomeType) contentChildren;
ngOnInit() {
this.viewChildren.changes.subscribe(changes => console.log(changes));
this.contentChildren.changes.subscribe(changes => console.log(changes));
}
truy cập DOM trực tiếp
chỉ có thể truy vấn các phần tử DOM, nhưng không thể truy cập các thành phần hoặc thể hiện lệnh:
export class MyComponent {
constructor(private elRef:ElementRef) {}
ngAfterViewInit() {
var div = this.elRef.nativeElement.querySelector('div');
console.log(div);
}
// for transcluded content
ngAfterContentInit() {
var div = this.elRef.nativeElement.querySelector('div');
console.log(div);
}
}
có được nội dung dự kiến tùy ý
Xem nội dung truy cập