2016-09-30 32 views
8

Sự khác biệt giữa RendererElementRef là gì? Trong Angular, cả hai đều được sử dụng cho DOM Thao tác. Tôi hiện đang sử dụng ElementRef một mình để viết chỉ thị Angular 2. Nếu tôi có thêm thông tin về Renderer, tôi có thể sử dụng thông tin đó trong các chỉ thị trong tương lai của mình.Sự khác nhau giữa Renderer và ElementRef ở góc 2

Trả lời

22

Renderer là lớp trừu tượng một phần trên DOM. Sử dụng Renderer để thao tác DOM không phá vỡ hiển thị phía máy chủ hoặc Công nhân Web (nơi truy cập trực tiếp vào DOM sẽ bị hỏng).

ElementRef là lớp có thể chứa tham chiếu đến phần tử DOM. Điều này một lần nữa là một trừu tượng không phá vỡ trong môi trường nơi DOM trình duyệt không thực sự có sẵn.

Nếu ElementRef được tiêm vào một thành phần, thể hiện được tiêm là tham chiếu đến phần tử máy chủ của thành phần hiện tại.

Có nhiều cách khác để có được ví dụ ElementRef như @ViewChild(), @ViewChildren(), @ContentChild(), @ContentChildren(). Trong trường hợp này, ElementRef là tham chiếu đến (các) yếu tố phù hợp trong mẫu hoặc trẻ em.

RendererElementRef không phải là "cái này hay cái kia", nhưng thay vào đó chúng phải được sử dụng cùng nhau để có được sự trừu tượng nền tảng đầy đủ.

Renderer hoạt động trên DOM và ElementRef là tham chiếu đến phần tử trong DOM Renderer hoạt động.

+0

Tôi tự hỏi tại sao các phương thức trình kết xuất yêu cầu 'elementRef.nativeElement' thay vì làm việc với' elementRef' như 'viewContainerRef'. Điều này có vẻ hơi không nhất quán. Ý tưởng nào? –

+0

Có vẻ không nhất quán, nhưng tôi nghĩ là không. Trong các phiên bản beta trước đó, 'renderer' chỉ lấy' ElementRef' nhưng chúng đã thay đổi nó sau này. Tôi nghĩ rằng trong các nền tảng như 'Universal'' ElementRef.nativeElement' không thực sự đề cập đến một phần tử DOM. Nếu bạn kiểm tra https://angular.io/docs/ts/latest/api/core/index/ElementRef-class.html bạn sẽ thấy rằng 'nativeElement' là kiểu' any' thay vì 'HTMLElement' –

+0

_In trước đó phiên bản beta renderer chỉ mất ElementRef nhưng họ đã thay đổi nó sau này._ - thật thú vị, cảm ơn. vâng, 'nativeElement' có thể tham chiếu đến các phần tử nền tảng cụ thể, nhưng chuyển elementRef thay vì elementRef.nativeElement vẫn là trừu tượng cao hơn và sẽ hoạt động theo bất kỳ cách nào –

2

Lưu ý rằng bạn nên hạn chế sử dụng ElementHref vì nó bị gắn cờ với rủi ro bảo mật.

góc 2 Tài liệu:

"Cho phép truy cập trực tiếp vào DOM có thể làm cho ứng dụng của bạn dễ bị tấn công XSS Xem xét cẩn thận bất kỳ sử dụng ElementRef trong mã của bạn Để cụ thể hơn, hãy xem Hướng dẫn an ninh... "

"Sử dụng API này làm phương sách cuối cùng khi cần truy cập trực tiếp vào DOM. Thay vào đó, hãy xem Renderer cung cấp API có thể sử dụng an toàn ngay cả khi truy cập trực tiếp thành phần tử gốc không được hỗ trợ. "

+6

Thực tế việc sử dụng 'ElementRef' không gây hại gì. Thủ phạm là 'ElementRef.nativeElement'. Đây là IMHO (tôi là tất cả trừ chuyên gia bảo mật) chỉ có tính bảo mật liên quan nếu người dùng cung cấp dữ liệu được sử dụng để thêm vào DOM, phải không? –

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