2017-04-13 11 views
9

Đối với một dự án phụ của tôi, tôi muốn triển khai luồng trò chuyện nơi thư mới được thêm vào dưới cùng và cửa sổ sẽ cuộn xuống cuối để hiển thị thông báo mới nhất.Trình kết xuất không được dùng làm ưu điểm cho renderer2, thay thế cho `invokeElementMethod`?

Để làm điều đó, tôi đã chọn sử dụng ViewChildren trên thành phần để tìm tin nhắn cuối cùng (mới nhất) và sử dụng scrollIntoView trên nativeElement.

Để không gọi phương thức bằng cách truy cập trực tiếp vào API DOM nativeElement.scrollIntoView(). Tôi tin rằng tôi sẽ cần sử dụng renderer.invokeElementMethod(nativeElement, 'scrollIntoView').

Sự cố là renderer không được dùng để ủng hộ renderer2 và tôi không thể tìm thấy phương án thay thế cho phương thức invokeElementMethod trong renderer2.

Câu hỏi là, có phương pháp nào tôi đã bỏ lỡ trong renderer2 để thực hiện điều đó không? hoặc chúng ta có cách mới để gọi phương thức phần tử bây giờ?

+1

https://github.com/angular/angular/issues/15008#issuecomment-285141070 – yurzui

Trả lời

11

Bạn có thể sử dụng phương thức selectRootElementRenderer2.

Ví dụ:

constructor(private renderer: Renderer2) {} 

this.renderer.selectRootElement('#domElementId').scrollIntoView() 

, nơi domElementIdid = 'domElementId' trong html của bạn

+0

tôi sẽ tránh sử dụng 'Renderer2' vì nó là người nghèo tài liệu cho thử nghiệm đơn vị ... để thử nghiệm bạn '' cuối cùng viết trình kết xuất của riêng bạn – DAG

+0

Điều này không làm việc cho tôi với Renderer2. Phần tử đã được chọn, nhưng gọi 'scrollIntoView' vừa xóa phần đó khỏi dom !! Tôi đã phải quay trở lại phương thức ViewChild gọi nó trực tiếp – Ryan

+0

Tôi không biết làm thế nào điều này có 10 upvotes. selectRootElement xóa tất cả các nút con của phần tử đã chọn. Nó chỉ được sử dụng để chọn phần tử góc gốc, chứ không phải để chọn các phần tử cụ thể Xem https://github.com/angular/angular/issues/19554#issuecomment-341848166 – Ryan

-1

Hãy trả lời này bởi một exapmple:

Trong trường hợp chúng ta có một như sau:

<input #inp1 type="text" placeholder="focus on me" /> 

Bên ngAfterViewInit(), nó cần phải được tập trung như thế này:

this.renderer.selectRootElement("inp1").scrollIntoView(); 
+0

@Brian Đầu vào của bạn được chào đón! Bạn có thể đăng các mã mà làm việc cho bạn như một câu trả lời, vì vậy những người khác có thể được hưởng lợi? – xameeramir

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