Lista de tarefas simples, mas com um botão excluir na página da lista para cada item:
HTML do modelo relevante:
<tr ng-repeat="person in persons">
<td>{{person.name}} - # {{person.id}}</td>
<td>{{person.description}}</td>
<td nowrap=nowrap>
<a href="#!/edit"><i class="icon-edit"></i></a>
<button ng-click="delete(person)"><i class="icon-minus-sign"></i></button>
</td>
</tr>
Método relevante do controlador:
$scope.delete = function (person) {
API.DeletePerson({ id: person.id }, function (success) {
// I need some code here to pull the person from my scope.
});
};
Eu tentei $scope.persons.pull(person)
e $scope.persons.remove(person)
.
Embora o banco de dados tenha sido excluído com êxito, não consigo extrair este item do escopo e não quero fazer uma chamada de método para o servidor para obter dados que o cliente já possui, só quero remover essa pessoa do escopo.
Alguma ideia?
javascript
html
angularjs
Tchau
fonte
fonte
Respostas:
Seu problema não é realmente com Angular, mas com métodos Array. A maneira correta de remover um item específico de uma matriz é com
Array.splice
. Além disso, ao usar ng-repeat, você tem acesso ao especial$index
propriedade , que é o índice atual da matriz pela qual você passou.A solução é realmente bem direta:
Visão:
Controlador:
fonte
indexOf
pode ser uma operação mais cara; sem filtragem, é completamente desnecessário. Mas com a filtragem,indexOf
seria o método apropriado.Você precisará encontrar o índice do
person
em suapersons
matriz e, em seguida, usar osplice
método da matriz :fonte
Eu usaria a biblioteca Underscore.js que possui uma lista de funções úteis.
without
Exemplo
Veja Demo no JSFiddle .
filter
Exemplo
Veja a demonstração no Fiddle .
fonte
$scope.nodes = _.without($scope.nodes, node);
porque ele tem referência aonode
Array.prototype.filter
._.filter(array, fun)
torna-searray.filter(fun)
.isso funciona para mim!
fonte
Se você tiver alguma função associada à lista, ao fazer a função de emenda, a associação também será excluída. Minha solução:
O parâmetro da lista é denominado itens . O parâmetro x.done indica se o item será excluído.
Outras referências: outro exemplo
Espero ajudá-lo. Saudações.
fonte
Para a resposta aceita de @ Joseph Silber não está funcionando, porque indexOf retorna -1. Provavelmente porque o Angular adiciona uma hashkey, que é diferente para o meu $ scope.items [0] e o meu item. Tentei resolver isso com a função angular.toJson (), mas não funcionou :(
Ah, eu descobri o motivo ... Eu uso um método chunk para criar duas colunas na minha tabela observando meus $ scope.items. Desculpe!
fonte
Você também pode usar isso
fonte
Angular tem uma função interna chamada
arrayRemove
, no seu caso, o método pode ser simplesmente:fonte
fonte
Para remover um elemento do escopo, use:
De indique descrição link aqui
fonte