2015-09-20 24 views
7

Từ những gì tôi đã đọc trong Angular 2 documentation của QueryList, @Query nên cho phép khả năng đưa tham chiếu đến thành phần con vào một thành phần nhất định.Góc 2.0 - Sự khác biệt giữa @ViewQuery và @Query

Sử dụng @QueryView tôi đã quản lý để có được một tham chiếu đến một phần tử DOM con như vậy:

// Parent component's template 
<my-component #test> 

// Parent component 
class ParentComponent { 
    constructor(@Query('test') child: QueryList<any>) {...} 
} 

tôi mong đợi rằng @Query có thể trở lại các thành phần phù hợp chứ không phải là phần tử DOM, nhưng tôi đã không được quản lý để làm cho nó hoạt động, cũng như tôi không tìm thấy bất kỳ tài liệu nào cho biết.

Sự khác biệt giữa hai trang trí này là gì?

+0

'@ ViewQuery' truy vấn DOM Xem (chế độ xem bạn chỉ định trong mẫu, còn gọi là Shadow DOM) và truy vấn' @ Query' cho DOM ánh sáng khi bạn sử dụng nó trong Chỉ thị (xem [vấn đề] này (https : //github.com/angular/angular/issues/1935)). Hãy nhớ rằng trong bản phát hành tiếp theo, alpha38, cả Truy vấn và Truy vấn sẽ được đổi tên (Xem [# 3922] (https://github.com/angular/angular/issues/3922)). –

+0

Eric, ý của bạn là gì về 'ánh sáng DOM'? Có cách nào để có được một tham chiếu đến các thành phần con, như vậy mà bạn có thể sau đó gọi phương pháp của nó? Cảm ơn bạn đã cảnh báo về alpha38! – jaker

+0

Tôi nhận được 'ánh sáng DOM' từ đây [Giới thiệu về shadow DOM] (https://www.polymer-project.org/0.5/platform/shadow-dom.html). Dưới đây là ví dụ về cách thực hiện: [plnkr] (http://plnkr.co/edit/WGupqC?p=preview), xem nhận xét trong đó. –

Trả lời

12

Trước tiên, bạn phải hiểu DOM ánh sáng và DOM bóng là gì. Những thuật ngữ này đến từ các thành phần web. Vì vậy, here is the link. Nói chung:

  • nhẹ DOM - là DOM người dùng cuối của cung cấp linh kiện của bạn vào thành phần của bạn.
  • DOM bóng - là DOM nội bộ thành phần của bạn được định nghĩa bởi bạn (như là một tác giả của các thành phần) và ẩn từ người dùng cuối.

Tôi nghĩ rằng, nhìn vào ví dụ tiếp theo bạn có thể dễ dàng hiểu được những gì là những gì (here is the plunker):

@Component({ 
    selector: 'some-component' 
}) 
@View({ 
    template: ` 
    <h1>I am Shadow DOM!</h1> 
    <h2>Nice to meet you :)</h2> 
    <ng-content></ng-content> 
    `; 
}) 
class SomeComponent { /* ... */ } 

@Component({ 
    selector: 'another-component' 
}) 
@View({ 
    directives: [SomeComponent], 
    template: ` 
    <some-component> 
     <h1>Hi! I am Light DOM!</h1> 
     <h2>So happy to see you!</h2> 
    </some-component> 
    ` 
}) 
class AnotherComponent { /* ... */ } 

Vì vậy, câu trả lời cho bạn câu hỏi là khá đơn giản:

Các sự khác biệt giữa QueryViewQueryQuery đang tìm kiếm các phần tử trong Light DOM trong khi ViewQuery đang tìm kiếm chúng trong Shadow DOM.

PS Ví dụ thể hiện phép chiếu nội dung đơn giản. Nhưng <ng-content> có thể làm nhiều thứ phức tạp hơn. Xem this issue.

+2

'@ Query' và' @ ViewQuery' không được dùng nữa, thay vào đó hãy sử dụng '@ ContentChildren' và' @ ViewChildren'. –

+0

@ GünterZöchbauer bạn có thể cho chúng tôi một liên kết đến nơi chúng được đánh dấu là không được chấp nhận không? Cảm ơn bạn. – yttrium

+2

https://github.com/angular/angular/blob/master/modules/angular2/src/core/metadata.dart#L162, https://github.com/angular/angular/blob/master/modules/angular2 /src/core/metadata.dart#L137 –

Các vấn đề liên quan