Eu sou novo em Angular.js e tenho alguns problemas para classificar meu array e trabalhar com esses dados classificados.
Tenho uma lista com itens e desejo classificá-la por "Store.storeName", que está funcionando até agora. Mas depois de classificar os dados, minha função de exclusão não está mais funcionando. Acho que é porque o $ index está errado após a classificação e, portanto, os dados errados são excluídos.
Como posso resolver isso? Ordenando os dados no escopo e não na visualização? Como fazer isso?
Aqui está algum código relevante:
Na visualização:
<tr ng-repeat="item in items | orderBy:'Store.storeName'">
<td><input class="toggle" type="checkbox" ng-model="item.Completed"></td>
<td>{{item.Name}}</td>
<td>{{item.Quantity}} Stk.</td>
<td>{{item.Price || 0 | number:2}} €</td>
<td>{{item.Quantity*item.Price|| 0 | number:2}} €</td>
<td>{{item.Store.storeName}}</td>
<td><a><img src="img/delete.png" ng-click="removeItem($index)">{{$index}}</a></td>
</tr>
E no meu controlador eu tenho esta função de exclusão, que deve excluir os dados específicos:
$scope.removeItem = function(index){
$scope.items.splice(index,1);
}
Isso funciona muito bem antes de fazer o pedido na Visualização. Se algo importante estiver faltando, por favor, deixe-me agora.
Obrigado!
fonte
Comecei a aprender angular e enfrentei problemas semelhantes, e com base na resposta de @ pkozlowski-opensource, resolvi apenas com algo como
fonte
Tive o mesmo problema e outras respostas neste tópico não são adequadas para a minha situação.
Resolvi meu problema com o filtro personalizado:
que pode ser usado desta forma:
e em HTML você pode usar em
item.index
vez de$index
.Este método é adequado para coleções de objetos.
Por favor, leve em consideração que este filtro personalizado deve ser o primeiro na lista de todos os filtros aplicados (orderBy etc.) e irá adicionar a propriedade adicional
index
(o nome é personalizável) em cada objeto da coleção.fonte
$scope.items.splice($scope.items.indexOf(item),1);
não funcionará como esperado para itens duplicados.(key, item) in items
e não funciona também. (a chave não é mantida no original)Experimente isto:
Você pode encontrar uma explicação detalhada nesta entrada em meu blog.
fonte
Caso alguém precise usar
$index
, você pode dar um nome à matriz classificada / filtrada:Veja minha resposta aqui .
fonte
Eu teria deixado um comentário, mas não tenho a "reputação".
A solução de milha é exatamente o que eu precisava também. Para responder à pergunta de pkozlowski.opensource: quando você tem
ngRepeat
s aninhados , uma lista dinâmica (por exemplo, onde você permite remoções) ou ambos (que é o meu caso), usar$index
não funciona porque será o índice errado para o back-end dados depois de classificar e usarngInit
para armazenar o valor em cache também não funcionam porque não são reavaliados quando a lista muda.Observe que a solução da milha permite que o nome da propriedade do índice anexado seja personalizado passando um parâmetro
<tr ng-repeat="item in items | index:'originalPosition' | orderBy:'Store.storeName'">
Minha versão ajustada:
fonte