Lista de tareas simple, pero con un botón Eliminar en la página de lista para cada elemento:
HTML de plantilla 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 de controlador relevante:
$scope.delete = function (person) {
API.DeletePerson({ id: person.id }, function (success) {
// I need some code here to pull the person from my scope.
});
};
Lo intenté $scope.persons.pull(person)
y $scope.persons.remove(person)
.
Aunque la base de datos se eliminó con éxito, no puedo extraer este elemento del alcance y no quiero hacer una llamada al método para el servidor para los datos que el cliente ya tiene, solo quiero eliminar a esta persona del alcance.
¿Algunas ideas?
javascript
html
angularjs
Adiós
fuente
fuente
Respuestas:
Su problema no es realmente con Angular, sino con los métodos de matriz. La forma correcta de eliminar un elemento particular de una matriz es con
Array.splice
. Además, cuando usa ng-repeat, tiene acceso a la$index
propiedad especial , que es el índice actual de la matriz que pasó.La solución es bastante sencilla:
Ver:
Controlador:
fuente
indexOf
puede ser una operación más costosa; sin filtrado, es completamente innecesario. Pero con el filtrado,indexOf
sería el método apropiado.Tendrá que encontrar el índice de
person
en supersons
matriz, luego use elsplice
método de la matriz :fuente
Me gustaría utilizar el Underscore.js biblioteca que tiene una lista de funciones útiles.
without
Ejemplo
Ver demostración en JSFiddle .
filter
Ejemplo
Ver demostración en Fiddle .
fuente
$scope.nodes = _.without($scope.nodes, node);
porque tiene referencia a lanode
Array.prototype.filter
._.filter(array, fun)
se conviertearray.filter(fun)
.esto funciona para mi!
fuente
Si tiene alguna función asociada a la lista, cuando realiza la función de empalme, la asociación también se elimina. Mi solución:
El parámetro de la lista se denomina elementos . El parámetro x.done indica si el elemento se eliminará.
Otras referencias: otro ejemplo
Espero ayudarte. Saludos.
fuente
Para la respuesta aceptada de @Joseph Silber no funciona, porque indexOf devuelve -1. Esto probablemente se deba a que Angular agrega un hashkey, que es diferente para mi $ scope.items [0] y mi artículo. Traté de resolver esto con la función angular.toJson (), pero no funcionó :(
Ah, descubrí la razón ... Utilizo un método fragmentado para crear dos columnas en mi tabla mirando mis $ scope.items. ¡Lo siento!
fuente
También puedes usar esto
fuente
Angular tiene una función incorporada llamada
arrayRemove
, en su caso, el método puede ser simplemente:fuente
fuente
Para eliminar un elemento del uso del alcance:
De ingrese la descripción del enlace aquí
fuente