Estou tentando escrever uma função que permita remover um item quando o botão é clicado, mas acho que estou ficando confuso com a função - eu uso $digest
?
HTML & app.js:
<ul ng-repeat="bday in bdays">
<li>
<span ng-hide="editing" ng-click="editing = true">{{bday.name}} | {{bday.date}}</span>
<form ng-show="editing" ng-submit="editing = false">
<label>Name:</label>
<input type="text" ng-model="bday.name" placeholder="Name" ng-required/>
<label>Date:</label>
<input type="date" ng-model="bday.date" placeholder="Date" ng-required/>
<br/>
<button class="btn" type="submit">Save</button>
<a class="btn" ng-click="remove()">Delete</a>
</form>
</li>
</ul>
$scope.remove = function(){
$scope.newBirthday = $scope.$digest();
};
remove()
ng-click
na maneira que você tem não tem contexto. Precisa de mais detalhes na marcação para mostrar o que está sendo removido e se está dentrong-repeat
ou onde o item a ser removido vem, ou o comportamento que você quer deremove()
Respostas:
Para remover o item, você precisa removê-lo da matriz e pode passar o
bday
item para sua função de remoção na marcação. Em seguida, no controlador, procure o índice do item e remova-o da matrizEntão no controlador:
O Angular detectará automaticamente a alteração na
bdays
matriz e fará a atualização dong-repeat
DEMO: http://plnkr.co/edit/ZdShIA?p=preview
EDIT: se fazer atualizações ao vivo com o servidor usaria um serviço criado por você
$resource
para gerenciar as atualizações da matriz ao mesmo tempo em que atualiza o servidorfonte
$index
diretamente pode gerar bugs se sua lista estiver filtrada no modelo. É uma coisa de modelo; é mais seguro usá-long-click='remove(bday)'
entãoarr.splice(arr.indexOf(bday),1);
this is undefined
. Plunker / jsfiddle talvez?.indexOf(item)
retornará -1 se não for encontrado, isso poderá resultar na remoção do item no final da matriz, se você não o verificar.Esta é uma resposta correta:
Na resposta de @ charlietfl. Eu acho que está errado, já que você passa
$index
como parâmetro, mas usa o desejo no controlador. Corrija-me se eu estiver errado :)fonte
indexOf
Funciona apenas se for IE9 + #Caso você esteja dentro de um ng-repeat
você pode usar uma opção de um forro
$index
é usado por angular para mostrar o índice atual da matriz dentrong-repeat
fonte
O uso
$index
funciona perfeitamente bem em casos básicos, e a resposta do @ charlietfl é ótima. Mas, às vezes,$index
não é suficiente.Imagine que você tem uma única matriz, que você está apresentando em duas repetições ng diferentes. Um desses ng-repeat's é filtrado para objetos que possuem uma propriedade de verdade e o outro é filtrado para uma propriedade false. Duas matrizes filtradas diferentes estão sendo apresentadas, que derivam de uma única matriz original. (Ou, se ajudar a visualizar: talvez você tenha uma única matriz de pessoas e deseje uma repetição de ng para as mulheres dessa matriz e outra para os homens dessa mesma matriz .) Seu objetivo: excluir com segurança o matriz original, usando informações dos membros das matrizes filtradas.
Em cada uma dessas matrizes filtradas, $ index não será o índice do item na matriz original. Será o índice no sub-array filtrado . Portanto, você não será capaz de informar o índice da pessoa na
people
matriz original , apenas conhecerá o índice $ dawomen
oumen
sub-matriz. Tente excluir usando isso, e você terá itens desaparecendo de todos os lugares, exceto onde você queria. O que fazer?Se você tiver a sorte de usar um modelo de dados, inclua um identificador exclusivo para cada objeto, use-o em vez de $ index, para encontrar o objeto e
splice
ele fora da matriz principal. (Use meu exemplo abaixo, mas com esse identificador exclusivo.) Mas se você não tiver tanta sorte?Angular na verdade aumenta cada item em uma matriz ng-repetida (na matriz original principal) com uma propriedade exclusiva chamada
$$hashKey
. Você pode pesquisar na matriz original por uma correspondência$$hashKey
do item que deseja excluir e se livrar dessa maneira.Observe que este
$$hashKey
é um detalhe de implementação, não incluído na API publicada para ng-repeat. Eles podem remover o suporte para essa propriedade a qualquer momento. Mas provavelmente não. :-)Invocar com:
EDIT: O uso de uma função como essa, que digita o
$$hashKey
nome da propriedade em vez de um nome de propriedade específico do modelo, também tem a vantagem adicional de tornar essa função reutilizável em diferentes modelos e contextos. Forneça sua referência de matriz e referência de item, e deve funcionar.fonte
Eu costumo escrever com esse estilo:
Espero que isso ajude Você precisa usar um ponto (.) Entre $ scope e [yourArray]
fonte
deleteCount
. Um número inteiro indicando o número de elementos antigos da matriz a serem removidos. Se deleteCount for 0, nenhum elemento será removido. Nesse caso, você deve especificar pelo menos um novo elemento. Se deleteCount for maior que o número de elementos restantes na matriz, iniciando no início, todos os elementos até o final da matriz serão excluídos. Array.prototype.splice () DocumentaçãoCom base na resposta aceita, isso vai trabalhar com
ngRepeat
,filter
e expections lidar melhor:Controlador:
Visão:
fonte
implementação sem um controlador.
O método splice () adiciona / remove itens de / para uma matriz.
índice : obrigatório. Um número inteiro que especifica em que posição adicionar / remover itens. Use valores negativos para especificar a posição no final da matriz.
howmanyitem : Opcional. O número de itens a serem removidos. Se definido como 0, nenhum item será removido.
item_1, ..., item_n : opcional. Os novos itens a serem adicionados à matriz
fonte
Discordo que você deveria estar chamando um método no seu controlador. Você deve usar um serviço para qualquer funcionalidade real e definir diretivas para qualquer funcionalidade para escalabilidade e modularidade, além de atribuir um evento de clique que contenha uma chamada para o serviço que você injeta em sua diretiva.
Então, por exemplo, no seu HTML ...
Em seguida, crie uma diretiva ...
Então em seu serviço ...
Quando você escreve seu código corretamente dessa maneira, facilita a gravação de alterações futuras sem precisar reestruturá-lo. Ele está organizado corretamente e você está manipulando eventos de clique personalizados corretamente vinculando usando diretivas personalizadas.
Por exemplo, se o seu cliente disser: "ei, agora vamos chamar o servidor e fazer pão e, em seguida, exibir um modal". Você poderá acessar facilmente o próprio serviço sem precisar adicionar ou alterar nenhum código de método HTML e / ou controlador. Se você tivesse apenas uma linha no controlador, acabaria precisando usar um serviço, para estender a funcionalidade ao levantamento mais pesado que o cliente está solicitando.
Além disso, se você precisar de outro botão 'Excluir' em outro lugar, agora terá um atributo de diretiva ('ng-remove-birthday') que poderá atribuir facilmente a qualquer elemento da página. Isso agora o torna modular e reutilizável. Isso será útil ao lidar com o paradigma HEAVY de componentes da web do Angular 2.0. Não há controlador no 2.0. :)
Desenvolvimento feliz !!!
fonte
Aqui está outra resposta. Eu espero que isso ajude.
A fonte completa está aqui
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice
fonte
se você tiver um ID ou algum campo específico em seu item, poderá usar filter (). age como Where ().
no controlador:
fonte
do controlador (a função pode estar no mesmo controlador, mas prefere mantê-lo em serviço)
fonte