Eu tenho um object com uma série de propriedades de object que está na seguinte estrutura semelhante (que é a maneira como os dados estão voltando de um serviço):
{ "1": { "type": "foo", "name": "blah" }, "2": { "type": "bar" }, "3": { "type": "foo" }, "4": { "type": "baz" }, "5": { "type": "test" } }
Quando eu faço um ng-repeat, posso iterar todos os 5 desses objects, algo como:
{{item.type}}
No entanto, o que eu realmente quero fazer é iterar apenas sobre os itens que não são do tipo “foo” , ou seja, 3 iterações em vez de 5. Eu sei que os filtros podem de alguma forma ser aproveitados para fazer isso, mas não sei como. Eu tentei o seguinte:
{{item.type}}
mas isso não funciona. De fato, mesmo fazendo o seguinte para limitar a apenas 2 objects (aqueles com item.type === “foo”), ele não funciona e faz 5 iterações:
{{item.type}}
Em essência, quero fazer algo semelhante a:
{{item.type}}
No entanto, sei que não funciona.
O filtro funciona em matrizes, mas você tem um literal de object.
Assim, você pode converter seu object literal em uma matriz ou criar seu próprio filtro do que o literal do object.
Se você não precisa desses valores de índice, a conversão para uma matriz pode ser sua melhor aposta (aqui está um violino com a matriz funcionando: http://jsfiddle.net/NqA8d/3/ ):
$scope.items = [{ "type": "foo", "name": "blah" }, { "type": "bar" }, { "type": "foo" }, { "type": "baz" }, { "type": "test" }];
Caso você queira fazer um filtro, aqui está uma maneira de fazer isso:
myApp.filter('myFilter', function () { return function (items, search) { var result = []; angular.forEach(items, function (value, key) { angular.forEach(value, function (value2, key2) { if (value2 === search) { result.push(value2); } }) }); return result; } });
E esse violino: http://jsfiddle.net/NqA8d/5/
Pouco tarde para responder, mas isso pode ajudar:
Se você quiser filtrar um neto (ou mais) do object fornecido, poderá continuar a construir sua hierarquia de objects. Por exemplo, se você quiser filtrar em ‘thing.properties.title’, você pode fazer o seguinte:
Você também pode filtrar várias propriedades de um object apenas adicionando-as ao seu object de filtro:
A syntax de ‘não é igual’ é apenas um pouco fora, tente o seguinte:
Embora eu concorde que a conversão do seu object possa ser a melhor opção aqui, você também pode usar essa function de filtro:
angular.module('app').filter('objectByKeyValFilter', function () { return function (input, filterKey, filterVal) { var filteredInput ={}; angular.forEach(input, function(value, key){ if(value[filterKey] && value[filterKey] !== filterVal){ filteredInput[key]= value; } }); return filteredInput; }});
como isso:
{{key}}{{value.type}}
Veja também o Plunker .
Tente isso (no controlador):
$scope.notFooFilter = function(item) { return (item.type !== 'foo'); };
E na marcação HTML:
{{item.type}}
Não precisa de tudo isso. Esta solução funciona bem sem ter que converter ou criar seu próprio filtro:
{{myModel.userSelectedHour["Start"]}}
Portanto, object. [“Property”] em vez de object.property.