example array angularjs angularjs-ng-repeat

angularjs - array - ng-repeat filter



ng-repeat angular omite un elemento si coincide con la expresión (3)

Estoy buscando una forma de decir básicamente angular para omitir un elemento en una repetición ng si coincide con una expresión, básicamente continue ;

En el controlador:

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

Ahora, en mi plantilla, quiero mostrar a todos los que no coincidan name_key=''FirstPerson'' . Pensé que tenían que ser filtros, así que configuré un Plunkr para jugar con él, pero no tuve suerte. Intento de Plunkr


Como @Maxim Shoustin sugirió, la mejor manera de lograr lo que desea sería usar un filtro personalizado.
Pero hay otras formas, una de ellas es usar la directiva ng-if en el mismo elemento donde pones la directiva ng-repeat (también, aquí está el plunker ):

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

Esto puede presentar una pequeña desventaja desde una perspectiva estética, pero tiene una gran ventaja de que su filtrado podría basarse en una regla que no está tan ajustada a la matriz de players y que puede acceder fácilmente a otros datos en el ámbito de su aplicación:

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

Actualizar
Como se dijo, esta es una de las soluciones para este tipo de problema y puede o no satisfacer sus necesidades.
Como se señala en los comentarios, ng-if es una directiva, lo que en realidad significa que podría hacer más cosas en el fondo de lo que cabría esperar.
Por ejemplo, ng-if crea un nuevo alcance desde su padre :

El alcance creado dentro de ngIf hereda de su ámbito principal usando herencia de prototipos.

Esto generalmente no afecta el comportamiento normal, pero para evitar casos inesperados, debe tener esto en cuenta antes de implementarlo.


Puede usar filtro personalizado cuando implementa ng-repeat . Algo como:

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; }; });

Demo Plunker


Sé que este es uno viejo, pero en caso de que alguien busque otra solución posible, aquí hay otra forma de resolver esto: use la funcionalidad de filter estándar:

Objeto: un objeto de patrón se puede usar para filtrar propiedades específicas en objetos contenidos en una matriz. Por ejemplo, el predicado {nombre: "M", teléfono: "1"} devolverá una matriz de elementos que tienen un nombre de propiedad que contiene "M" y un teléfono de propiedad que contiene "1". ... El predicado se puede negar prefijando la cadena con! Por ejemplo, el predicado {nombre: "! M"} devolverá una matriz de elementos que tienen un nombre de propiedad que no contiene "M".

Entonces, para el ejemplo TS algo como esto debería hacer:

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

No es necesario escribir filtros personalizados, no es necesario usar ng-if con su nuevo alcance.