2013-11-05 13 views
86

我正在尋找一種方法來基本告訴角度跳過一個ng-repeat中的項目,如果它匹配表達式,基本上continue;角ng-repeat跳過一個項目,如果它匹配表達式

在控制器:

$scope.players = [{ 
    name_key:'FirstPerson', first_name:'First', last_name:'Person' 
}, { 
    name_key:'SecondPerson', first_name:'Second', last_name:'Person' 
}] 

現在在我的模板,我想告訴大家的是不匹配name_key='FirstPerson'。我想它必須是過濾器,所以我設置了一個普朗克來玩它,但沒有任何運氣。 Plunkr Attempt

+0

我嘗試瞭解:你想顯示所有項目,但指出誰匹配誰不是誰?或只是過濾? –

回答

134

由於@Maxim Shoustin建議,以達到你想要的是使用自定義過濾器的最佳方式。
但也有其他的方式,其中之一是使用ng-if指令在相同的元素是你把ng-repeat指令(還有,這裏的plunker):

<ul> 
    <li ng-repeat="player in players" ng-if="player.name_key!='FirstPerson'"></li> 
</ul> 

這可以從呈現輕微的缺點estetical的觀點,但有您的過濾可以基於未緊耦合到players陣列,並且可以很容易地在應用程序的範圍內訪問其他數據的規則的一大優勢:

<li 
     ng-repeat="player in players" 
     ng-if="app.loggedIn && player.name != user.name" 
    ></li> 

更新
如上所述,這是解決方案之一這種問題,可能會或可能不適合您的需求。
正如在評論中指出的那樣,ng-if是一個指令,這實際上意味着它可能會在背景中做比您預期的更多的事情。
例如,ng-ifcreates a new scope from it's parent

內ngIf創建的範圍使用原型繼承從其父範圍繼承。

這通常不會影響正常的行爲,但爲了防止出現意外的情況,在實施之前應該牢記這一點。

+0

這正是我所期待的,知道必須有一些簡短而美好的方式不用自定義過濾器就可以做到。謝謝! –

+0

注意:有一些作用域的行爲 - 如果這可能會很棘手。我嘗試了這種方法,並在別處引發了問題。也就是說,我有一個「觀察者」指令,當中繼器完成時廣播事件。在將ng-if添加到該中繼器之後,它不再發起該事件。自定義過濾器實際上可能是最乾淨的方式。 – claywhipkey

+0

@claywhipkey你是對的,最清潔的方式是使用過濾器,但是這不適合所有情況。無論如何,thx的評論,你可以看到,我已經在答案中增加了*提升*更新只是爲了讓任何人知道使用指令過濾數據的影響。 –

18

當您執行ng-repeat時,您可以使用自定義過濾器。喜歡的東西:

data-ng-repeat="player in players | myfilter:search.name 

myfilter.js

app.filter('myfilter', function() { 


    return function(items, name) { 
    var filtered = []; 

    angular.forEach(items, function(item) { 

     if(name == undefined || name == ''){ 
     filtered.push(item); 
     } 

     /* only if you want start With*/ 
     // else if(item.name_key.substring(0, name.length) !== name){ 
     // filtered.push(item); 
     // } 

     /* if you want contains*/ 
     // else if(item.name_key.indexOf(name) < 0){ 
     // filtered.push(item); 
     // } 

     /* if you want match full name*/ 
     else if(item.name_key !== name){ 
     filtered.push(item); 
     } 
    }); 

    return filtered; 
    }; 
}); 

演示Plunker

+0

感謝您爲此付出的努力。它絕對正確,但我最終以代碼中的@ gion_13答案的易用性進行了討論,所以我認爲我更好地將他標記爲公認的答案 –

35

我知道這是一個古老的,但萬一有人會尋找另一種可能的解決方案,這裏是另一種方式來解決這個問題 - 使用標準filter功能:

對象:的模式對象可以用於過濾數組中包含的對象的特定屬性。例如{名稱:「M」,電話:「1」} 謂詞將返回包含屬性名稱爲 的項目數組,其中包含「M」和屬性手機包含「1」。 ... 謂詞 可以通過在字符串前添加!來取代。例如{名稱: 「!M」}謂詞將返回一個不包含「M」的屬性名稱爲 的項目數組。

所以對於TS例如這樣的事情應該做的:

<ul> 
    <li ng-repeat="player in players | filter: { name_key: '!FirstPerson' }"></li> 
</ul> 

無需編寫自定義過濾器,沒有必要使用ng-if與它的新範圍。

+0

簡單點。沒有自定義過濾器或作者創建的新範圍。適用於跳過列表中的單個值。 – mbokil

+0

我想你需要從'player.name_key'中省略'player' - 所以在上面的例子中它只是「{name_key:'!FirstPerson'}」。 – smithml

+0

我從來沒有能夠讓Angular玩空鍵。是否存在某種使用內置過濾器的技巧,相當於玩家中的'玩家| |過濾器:{name_key:''}'?該特定指令不會僅匹配沒有/空'name_key'的玩家。反過來,'name_key:'!''用於選擇任何具有非空'name_key'的玩家也不會起作用。 –

相關問題