2015-06-01 24 views
1

我希望這個問題不是太自以爲是因爲我已經看到這麼多類型的問題關閉了。我不在尋找偏好或觀點:我對代碼選擇在加載時間,服務器開銷和其他性質方面扮演的角色沒有多少了解。哪種方法更有效率/合適:使用ng-repeat顯示全部或首先查詢較小的組?

所以我有一個場景,我想與我可以採取的幾條不同的路線分享。我想知道哪種方式在工作量,過載,加載時間等方面效率更高。我不需要有人深入探討其中的任何一個細節:簡而言之,這是最好的解決方案?

我的情況是這樣的:

我會從PHP頁面中檢索到我的AngularJS應用中的JSON對象例如:

{"links":[ 
    { 
    "Section":"1", 
    "Title":"Go to abc.html", 
    "URL":"abc.html", 
    "GoTo":"" 
    },{ 
    "Section":"2", 
    "Title":"Go to def.html", 
    "URL":"def.html", 
    "GoTo":"" 
    },{ 
    "Section":"1", 
    "Title":"Go to ghi.html", 
    "URL":"", 
    "GoTo":"2" 
]}; 

SOLUTION 1

我使用ng-repeat顯示這些,使用ng-if來決定顯示哪個鏈接。例如,當頁面加載時,我們有$scope.currentSection = 1。接下來在HTML中。

<li ng-repeat="x in links" ng-if="x.Section==currentSection"> 
    <a href="{{x.URL}}" ng-click="changeSection(x.GoTo)" >{{x.Title}}</a> 
</li> 

因此,這將顯示的任何鏈接中的「第1條」,在這種情況下,我的JSON對象中的第一和第三項。然後,當用戶單擊更改視圖的鏈接時,changeSection只是更改currentSection的值,並且視圖會更改。

這個解決方案是完美的:光滑和簡單(我剛剛學會了如何使用ng-if,所以我個人很驚訝)。

但是,現在讓我們說在對象中有100個或更多項目。根據我讀到的,ng-if至少將ng-repeat中所有未使用的項目排除在DOM之外,但它仍然陷入不得不通過尋找「第1部分」的每個項目?

儘管如此,這似乎是比我的下一個解決方案更「角度的方式」來做到這一點。

解決方案2

我可以query在同一時間只有一個部分。然後在那做一個ng-repeat。而改變視圖的函數會調用一個PHP文件,該文件返回包含新節中所有鏈接的新查詢,並可能非常相似地更改視圖。我也會存儲這個查詢的結果,這樣如果再次需要的話,它不需要再次從服務器中檢索:因爲它有可能返回到部分。


因此,我們有的解決方案,在服務器上查詢一次,ng-repeat使用所有條款顯示,只顯示基於給定ng-if的項目。或者解決方案,該查詢在用戶導航時進行查詢,不止一次與服務器通信,但不是無限次的。另外,這是假設我們可以在JSON對象中有100個項目。

就我個人而言,我很樂意被告知我可以使用ng-repeat方法,而不會導致巨大的過載問題。

+0

第一個對我來說似乎很好,但是對於ng來說不是 - 如果我會在ng-repeat上使用過濾器。由於我沒有真正進入表演,這只是一些猜測。 – Okazari

+0

@Okazari我會研究過濾器,我已經用它們來做簡單的事情,但不會想到爲此使用它。我不得不猜測,儘管它會有相同的性能,因爲它仍然需要通過每個項目來查找根據過濾器。這也是我的猜測。謝謝你的反饋! – Christine268

回答

2

我相信分頁好於得到所有的做法。

你可以做的是實現緩存爲了避免在一些預定義的時間內對服務器的進一步請求。

當您使用獲取所有方法時,應確保用戶將訪問來自UI層的所有數據的變化很大。如果不是,獲取所有數據是一個完整的矯枉過正,它會增加網絡流量。另外,如果每個視圖有很多鏈接,我也會在那裏實現分頁。頁面大小可能會根據您自己的要求而有所不同。

+0

我對緩存知之甚少,我試圖在一般情況下閱讀它,但文檔對我來說很困惑。但是我覺得只是點了點東西,這有點像餅乾呢?所以,如果一個用戶訪問這個視圖或內容或其他什麼,它會被緩存,因爲另一個用戶訪問相同視圖的機率可能很高?如果這是一個普遍的觀點。這是一個* intranet *排序的感覺網站,一次只有有限的用戶與它互動,所以我不認爲交通將是一個大問題。但是,就我自己的知識而言,嘗試實施 – Christine268

+0

@ Christine268會很有趣,緩存可以發生在客戶端或服務器端,甚至是雙方。我正在考慮使用DOM本地存儲或類似的東西,你可以將結果序列化爲JSON並將它們存儲在那裏。您可以爲存儲的JSON添加到期日期,因此如果您在到期日期之後嘗試獲取它,您將再次向服務器執行實際請求 –

+0

@ Christine268即使在Intranet站點中,緩存也可以將任何應用程序轉變爲快速的一個。你永遠不知道是否從互聯網訪問內部網,並且用戶的連接速度很慢,甚至服務器很忙......如果你使用基本緩存,並且避免服務器往返,你的應用將始終正常運行 –