2013-04-08 47 views
8

Normalde ng-repeat kullanarak göstermek istediğim öğeler var. Bir sırayla (kolay) göstermek istiyorum, ancak sipariş edilen özellik değiştiğinde, arada bir HTML istiyorum.Gruplar ng-yinelemede nasıl ayrılır

Örnek: (Fiddle):

<div ng-app ng-controller="Main"> 
    <div ng-repeat="item in items | orderBy:'role'"> 
     {{item.role}} - {{item.name}} 
    </div> 
</div> 

function Main($scope){ 
    $scope.items = [{name: 'First', role: 1}, 
        {name: 'Second', role:2}, 
        {name: 'Third', role: 1}, 
        {name: 'Fourth', role: 2}]; 
    } 

Ben baskıya istiyorum:

1 - Birinci
1 - Üçüncü
(bazı ayırıcı Kode)
2 - İkinci
2 - Dördüncü

+0

Bunun işe yarayıp yaramayacağını öğrenin: http://stackoverflow.com/a/14076254/215945 –

+0

@MarkRajcok teşekkür ederim, işe yarıyor. Ancak, sipariş verilebilecek birçok özellik ve büyük bir veri kümesi olduğu için kopya çıkarmayı tercih etmem. – Matsemann

+0

Büyük bir veri kümeniz varsa, HTML’nizdeki bir filtreye pipetlemek istemeyeceğinizden (bu her bir döngü döngüsü değerlendirilecektir) (http://stackoverflow.com/a/15646675/215945)! –

cevap

15

Kapsamınızda bir işlev oluşturmak isteyeceksiniz.

$scope.currentRole = 'something'; 
$scope.CreateHeader = function(role) { 
     showHeader = (role!=$scope.currentRole); 
     $scope.currentRole = role; 
     return showHeader; 
} 

Sonra HTML'nize: @lucuma tarafından çözüm yalnızca döngü aracılığıyla ilk kez çalışır

<div ng-app ng-controller="Main"> 
    <div ng-repeat="item in items | orderBy:'role'"> 
     <div ng-show="CreateHeader(item.role)"> 
     something here for the header 
     </div> 
     {{item.role}} - {{item.name}} 

    </div> 
</div> 
+0

Teşekkürler, bu hile yapar. İlkini ´ng-show = "CreateHeader (item.role) &&! $ First" ´ – Matsemann

+0

ekledim. (Item.role, $ last) yaparak atlayabilirim. Sonra son == true olduğunda $ scope.currentRole'u sıfırladım. Bu, rol değişmediğinde ortaya çıkan bir sorunu giderir (örneğin, yineleme birden çok kez çalıştırıldığı için, sonuncusu başlığını gizleyen ilk ile aynıdır). –

+4

Bu mükemmel çalışır, ancak her bir grubu bir html öğesiyle sarmak istersem nasıl olurdum? İlk denemem, html öğesini açmak ve kapatmak için iki kez CreateHeader doğrulama yapmaktır, ancak bunu başarmanın en iyi yolu olmadığını düşünüyorum. Bunun için herhangi bir geçici çözüm var mı? – asumaran

1

. Angular listeyi yeniliyorsa, değişken hala önceki döngüden ayarlanacaktır.

<div ng-app ng-controller="Main"> 
    <div ng-repeat="item in items | orderBy:'role'"> 
    <div ng-show="item.header"> // <== with this change 
     something here for the header 
    </div> 
    {{item.role}} - {{item.name}} 
    </div> 
</div> 

Oh, ve sıralamak:

function Main($scope){ 
    $scope.items = [{name: 'First', role: 1, header: false}, 
        {name: 'Second', role:2, header: false}, 
        {name: 'Third', role: 1, header: true}, 
        {name: 'Fourth', role: 2, header: false}]; 
} 

Sonra @lucuma HTML çalışır:

Bunun yerine, başlatma sırasında listeye yeni bir özellik (diyelim ki, header) eklendi listeyi bir kez başlatırken ve orderBy filtresini kaldırın.

İlgili konular