javascript - example - ng-repeat filter condition
Angular.js ng-repeat filter por propiedad que tiene uno de varios valores(OR de valores) (7)
Aquí hay una manera de hacerlo mientras se pasa un argumento extra:
https://stackoverflow.com/a/17813797/4533488 (gracias a Denis Pshenov)
<div ng-repeat="group in groups">
<li ng-repeat="friend in friends | filter:weDontLike(group.enemy.name)">
<span>{{friend.name}}</span>
<li>
</div>
Con el backend:
$scope.weDontLike = function(name) {
return function(friend) {
return friend.name != name;
}
}
.
Y aún otra manera con un filtro en plantilla solamente:
https://stackoverflow.com/a/12528093/4533488 (gracias a Mikel)
<div ng:app>
<div ng-controller="HelloCntl">
<ul>
<li ng-repeat="friend in friends | filter:{name:''!Adam''}">
<span>{{friend.name}}</span>
<span>{{friend.phone}}</span>
</li>
</ul>
</div>
¿Es posible filtrar una matriz de objetos, de manera que el valor de la propiedad puede ser de algunos valores (condición OR) sin escribir un filtro personalizado
Esto es similar a este problema - Angular.js ng-repeat: filtra por campo único
Pero en lugar de
<div ng-repeat="product in products | filter: { color: ''red'' }">
¿Es posible hacer algo como esto?
<div ng-repeat="product in products | filter: { color: ''red''||''blue'' }">
para una muestra de datos como sigue:
$scope.products = [
{ id: 1, name: ''test'', color: ''red'' },
{ id: 2, name: ''bob'', color: ''blue'' }
/*... etc... */
];
He intentado sin éxito
<div ng-repeat="product in products | filter: { color: (''red''||''blue'') }">
Después de no poder encontrar una buena solución universal, hice algo propio. No lo he probado para una lista muy grande.
Se ocupa de las claves anidadas, matrices o casi cualquier cosa.
app.filter(''xf'', function() {
function keyfind(f, obj) {
if (obj === undefined)
return -1;
else {
var sf = f.split(".");
if (sf.length <= 1) {
return obj[sf[0]];
} else {
var newobj = obj[sf[0]];
sf.splice(0, 1);
return keyfind(sf.join("."), newobj)
}
}
}
return function(input, clause, fields) {
var out = [];
if (clause && clause.query && clause.query.length > 0) {
clause.query = String(clause.query).toLowerCase();
angular.forEach(input, function(cp) {
for (var i = 0; i < fields.length; i++) {
var haystack = String(keyfind(fields[i], cp)).toLowerCase();
if (haystack.indexOf(clause.query) > -1) {
out.push(cp);
break;
}
}
})
} else {
angular.forEach(input, function(cp) {
out.push(cp);
})
}
return out;
}
})
HTML
<input ng-model="search.query" type="text" placeholder="search by any property">
<div ng-repeat="product in products | xf:search:[''color'',''name'']">
...
</div>
En HTML:
<div ng-repeat="product in products | filter: colorFilter">
En Angular:
$scope.colorFilter = function (item) {
if (item.color === ''red'' || item.color === ''blue'') {
return item;
}
};
Encontré una solution más genérica con la solution más angulosa-nativa que puedo pensar. Básicamente, puede pasar su propio comparador a la función de filterFilter
predeterminada. Aquí también es plunker .
La cosa "ng-if" debería funcionar:
<div ng-repeat="product in products" ng-if="product.color === ''red''
|| product.color === ''blue''">
La mejor manera de hacer esto es usar una función:
<div ng-repeat="product in products | filter: myFilter">
$scope.myFilter = function (item) {
return item === ''red'' || item === ''blue'';
};
Alternativamente, puede usar ngHide o ngShow para mostrar y ocultar elementos de forma dinámica según un criterio determinado.
Para mí, funcionó como se indica a continuación ..
<div ng-repeat="product in products | filter: { color: ''red''} | filter: { color:''blue'' }">