2017-04-13 151 views
9

對於我的一個側面項目,我想實現一個聊天流,其中新消息添加到底部,並且窗口應滾動到底部以顯示最新消息。Renderer已被棄用,作爲renderer2的替代方法,invokeElementMethod的替代方法?

爲了做到這一點,我選擇在組件上使用ViewChildren來查找最後一條消息(最新),並在nativeElement上使用scrollIntoView

爲了不通過訪問DOM API直接調用方法nativeElement.scrollIntoView()。我相信我將需要使用renderer.invokeElementMethod(nativeElement, 'scrollIntoView')

問題是renderer是贊成不贊成renderer2,我似乎無法找到替代爲renderer2方法invokeElementMethod

問題是,有沒有一種方法,我錯過了renderer2這樣做?或者我們現在有一種調用元素方法的新方法?

+1

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

回答

11

您可以使用selectRootElement方法Renderer2

例如:

constructor(private renderer: Renderer2) {} 

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

,其中domElementIdID = 'domElementId'在HTML

+0

我會避免使用'Renderer2'因爲它是可憐記錄爲單元測試...測試你最終編寫自己的渲染器 – DAG

+0

這對Renderer2來說並不適用。該元素被選中,但調用'scrollIntoView'只是從dom中刪除該部分!我不得不恢復到直接調用它的ViewChild方法 – Ryan

+0

我不知道這是如何有10個upvotes。 selectRootElement刪除選定元素的所有子節點。它只用於選擇根角元素,而不是用於選擇特定元素。請參閱https://github.com/angular/angular/issues/19554#issuecomment-341848166 – Ryan

-1

讓我們通過一個exapmple回答這個問題:

如果我們有一個像這樣的看法:

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

裏面ngAfterViewInit(),它需要給予關注這樣的:

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

@Brian歡迎您的輸入!你可以發佈你的代碼作爲答案,所以其他人可以受益嗎? – xameeramir

相關問題