I'm buscando una manera de decirle básicamente angular para saltar un elemento en un ng-repeat si coincide con una expresión, básicamente continue
;
En 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 todos los que no coinciden con name_key='FirstPerson'
. Me imaginé que tiene que ser filtros por lo que la configuración de un Plunkr a jugar con él, pero haven't tenido suerte. Intento de Plunkr
Como sugirió @Maxim Shoustin, la mejor manera de conseguir lo que quieres sería utilizar un filtro personalizado.
Pero hay otras formas, una de ellas es usar la directiva ng-if
en el mismo elemento donde pusiste la directiva ng-repeat
(también, aquí 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 la gran ventaja de que su filtrado podría basarse en una regla que no está tan estrechamente vinculada a la matriz 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>
Actualización
Como se ha dicho, esta es una de las soluciones para este tipo de problema y puede o no adaptarse a 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 segundo plano de lo que cabría esperar.
Por ejemplo, ng-if
crea un nuevo ámbito a partir de su padre:
El ámbito creado dentro de ngIf hereda de su ámbito padre usando herencia prototípica.
Esto normalmente no afecta al comportamiento normal, pero para prevenir casos inesperados, deberías tenerlo en cuenta antes de implementarlo.
Sé que esto es viejo, pero en caso de que alguien busque otra posible solución, aquí hay otra manera de resolver esto - utilizar la funcionalidad estándar filtro:
Objeto: Un objeto patrón puede ser usado para filtrar propiedades específicas en objetos contenidos por matriz. Por ejemplo {name:"M", phone:"1"} El predicado > devolverá un array de elementos que tengan la propiedad name que contenga "M" y la propiedad phone que contenga "1". ... El predicado puede negarse anteponiendo a la cadena el prefijo !. Por ejemplo {nombre: "!M"} el predicado devolverá una matriz de elementos que tengan la propiedad nombre que no contenga "M".
Así que para el ejemplo TS algo como esto debería hacer:
<ul>
<li ng-repeat="player in players | filter: { name_key: '!FirstPerson' }"></li>
</ul>
No hay necesidad de escribir filtros personalizados, no hay necesidad de utilizar ng-if
con su nuevo alcance.
Puedes usar un filtro personalizado cuando implementes 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