22

我正在構建一個使用離子和AngularJS(AngularJS材質)的混合應用程序。此應用程序還具有與Node.js和socket.io構建的集成聊天。AngularJS:與不同高度的行重複虛擬

我現在遇到的問題是,只有200條消息,應用程序加載所有消息的速度非常緩慢(瀏覽器中的200ms - 應用程序中的4sec,即使使用CrossWalk,也使用message.id跟蹤)插入消息的textarea速度會變慢。

我有兩個解決方案來解決此問題:

  1. 虛擬重複(MD-虛擬重複)
  2. 無限滾動(離子無限滾動)

1)我認爲,虛擬重複將是最好的解決方案(我已經在另一個頁面上實現了它,它可以像魅力一樣滾動1500個項目),但問題是根據消息長度和md-virtual-repeat要求,消息可能具有不同的高度。元素必須與w具有相同的高度掃。

2)所以,也許我們可以轉到無限滾動方法,但現在的問題是,使用ion-infinite-scroll指令來做到這一點有點棘手,因爲聊天需要在到達頂部時觸發loadMore()而不是底部。

所以我的問題是:沒有任何人有一種變通方法有一個平滑/快聊天中使用NG-重複或,可處理不同高度的無限滾動,在該工作的虛擬重複指令頂部

+0

您是否找到解決方案? – InsFi

回答

1

您是否看過React.js作爲解決方案?它使用虛擬DOM,這使得更新長列表更有效率。

GitHub上有一個開源的repo,它將Angular和React混合在一起,稱爲ngReact。

概述: http://ngreact.github.io/ngReact/

文檔: http://ngreact.github.io/ngReact/docs/ngReact.html

回購: https://github.com/ngReact/ngReact

希望這有助於。

+0

我個人不知道React並從未使用它。如果這會顯示出最好的解決方案,你認爲需要多少時間來學習?我是一名自由職業者,我需要依靠時間跑步來謀生 –

+0

這取決於你對Angular的使用感覺如何。如果你對Angular有很好的把握,那麼挑選它應該不會太困難。 – Matt

1

使用單獨的粘合劑,如鉚釘可能是一個很好的解決方案,它易於集成,其具有RV-每個循環

+0

請您詳細說明(可能有鏈接)? –

+0

請參考這[鏈接](http://rivetsjs.com/),它是一個輕量級和相對較快的活頁夾,它可以幫助你,它支持簡單的Javascript雙向綁定,如何使用在這裏[鏈接](http ://justbuildsomething.com/agnostic-data-binding-with-rivets-js/) –

1

我覺得離子指令collection-repeat可能是你在找什麼。

collection-repeat允許應用程序顯示比ng-repeat更多的項目的巨大列表 。它只顯示當前可見的 項目。這意味着在 可以放八個項目的電話屏幕上,只會顯示與當前卷軸 位置相匹配的八個項目。

+0

「如果未提供項目高度和項目寬度屬性,則會假定列表中的每個項目具有相同的尺寸作爲第一項。「 - 在我的情況下有點問題o你認爲它可以修復嗎 –

+0

我已經試過了,但如果第一條消息很小,我把一個大文本的消息氣泡收縮,反過來如果第一條消息是大 –

+0

@Smile應用程序也許它可以工作,如果你添加'項目文本包裝'類的消息項 – nicfo

2

你可以嘗試加速它的一些事情。

其中之一是使用像快速-NG-重複:https://github.com/allaud/quick-ng-repeat,而不是建立在角JS NG-重複

另一個辦法是使用one time binding在以往任何時候可以防止角從期間每不斷尋找變化摘要循環:https://docs.angularjs.org/guide/expression#one-time-binding

當然,如果可能的話,請嘗試使用chrome的開發人員工具配置文件選項來找出哪些函數會降低應用程序的速度; )

PS:可能是值得檢查出這個線程看看無限滾動逆如何可以實現:Implementing a reverse infinite scroll using ngInfiniteScroll directive in AngularJS

2

md-virtual-repeatcollection-repeat高效滾動列表需要了解每個項目的高度才能工作。這是因爲他們需要知道滾動位置,例如顯示一個滾動條或可以跳過幀以快速向下滑動。滾動位置本身只有在知道滾動了多少(我們需要上面元素的高度)以及剩下多少滾動(我們需要下面元素的高度)時才能找到滾動位置本身。

你可以做的是使用工廠計算每個元素的高度,然後將它們注入到循環中。這可以通過創建一個與目標容器具有相同屬性的容器(例如CSS類),追加新加載的元素,計算它們的高度(使用element.offsetHeight)並在之後刪除容器來完成。

請注意,這是相當重的,並可能會導致一個小的滯後高峯。

+0

是的,我也是這樣做的,但是,因爲我沒有任何緩慢(因爲我使用的是id),但是第一次只顯示消息需要很長時間,你認爲這種方法實際上是一種改進嗎? –

+0

如果你一次加載<30個項目(消息),並且你的列表正在穩定增長,這絕對是對'ng-repeat'的改進! – Iso

+0

@您之前是否已經實施過這種方法?或者您是否閱讀過有關如何完成此項任務的任何示例? –

0

角VS-重複angular-vs-repeat

演示:demo

我使用線路長度的項目的計算高度。

這是非常近似的方法。在我們的應用程序中,我們知道,字體大小爲15px的英文字符寬度大約爲6.7px(這很好,如果使用等寬字體,但它不是我們的情況)。我們也總是知道每個段的寬度和一條文本行的高度。 itemHeight = commulativeTextLenght/lineWidth + paddingsOfItem; 同樣,折線階可能會影響您的計算。一般來說,我們有一個不錯的方法來計算約8000個文本段落的高度。

+1

請閱讀[如何回答]部分(http://stackoverflow.com/help/how-to-answer),特別是本節:**爲鏈接**提供上下文。即以舉例說明:解釋鏈接的作用,如果您有演示,請在答案中包含代碼。 – AgataB

+0

你是如何根據線長計算單元高度的?你能提供一個解決方案的例子嗎? –