Estoy tratando de escribir una función que me permita eliminar un elemento cuando se hace clic en el botón, pero creo que me estoy confundiendo con la función: ¿lo uso $digest
?
HTML y 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()
enng-click
la forma en que lo tienes no tiene contexto. Necesita más detalles en el marcado para mostrar qué se está eliminando y si está dentrong-repeat
, o de dónde proviene el elemento que se está eliminando, o qué comportamiento desearemove()
Respuestas:
Para eliminar el elemento, debe eliminarlo de la matriz y puede pasar el
bday
elemento a su función de eliminación en el marcado. Luego, en el controlador, busque el índice del elemento y retírelo de la matrizLuego en el controlador:
Angular detectará automáticamente el cambio en la
bdays
matriz y realizará la actualización deng-repeat
DEMO: http://plnkr.co/edit/ZdShIA?p=preview
EDITAR: si realizar actualizaciones en vivo con el servidor usaría un servicio que usted cree
$resource
para administrar las actualizaciones de la matriz al mismo tiempo que actualiza el servidorfuente
$index
directo puede generar errores si su lista se filtra en la plantilla. Es una cosa de plantilla; es más seguro de usarng-click='remove(bday)'
entoncesarr.splice(arr.indexOf(bday),1);
this is undefined
. ¿Plunker / jsfiddle quizás?.indexOf(item)
devolverá -1 si no se encuentra, esto podría resultar en la eliminación del elemento al final de la matriz si no lo verifica.Esta es una respuesta correcta:
En la respuesta de @ charlietfl. Creo que está mal, ya que pasas
$index
como parámetro pero usas el deseo en su lugar en el controlador. Corrígeme si me equivoco :)fuente
indexOf
SOLO funciona si es IE9 +En caso de que estés dentro de una repetición
podría usar una opción de un solo revestimiento
$index
es utilizado por angular para mostrar el índice actual de la matriz dentrong-repeat
fuente
El uso
$index
funciona perfectamente bien en casos básicos, y la respuesta de @ charlietfl es excelente. Pero a veces,$index
no es suficiente.Imagine que tiene una sola matriz, que está presentando en dos ng-repeat's diferentes. Uno de esos ng-repeat es filtrado por objetos que tienen una propiedad de verdad, y el otro es filtrado por una propiedad de falsedad. Se presentan dos matrices filtradas diferentes, que se derivan de una matriz original única. (O, si ayuda a visualizar: tal vez tiene una sola matriz de personas, y desea una repetición de ng para las mujeres en esa matriz, y otra para los hombres en esa misma matriz ). Su objetivo: eliminar de manera confiable matriz original, utilizando información de los miembros de las matrices filtradas.
En cada una de esas matrices filtradas, $ index no será el índice del elemento dentro de la matriz original. Será el índice en la submatriz filtrada . Por lo tanto, no podrá distinguir el índice de la persona en la
people
matriz original , solo sabrá el $ index de lawomen
omen
sub-matriz. Intenta eliminar usando eso, y tendrás elementos que desaparecerán de todas partes excepto donde quisieras. ¿Qué hacer?Si tienes la suerte de estar usando un modelo de datos que incluye un identificador único para cada objeto, entonces úsalo en lugar de $ index para encontrar el objeto y
splice
sacarlo de la matriz principal. (Use mi ejemplo a continuación, pero con ese identificador único). ¿Pero si no tiene tanta suerte?Angular en realidad aumenta cada elemento en una matriz ng repetida (en la matriz principal original) con una propiedad única llamada
$$hashKey
. Puede buscar una coincidencia en la matriz original$$hashKey
del elemento que desea eliminar y deshacerse de ella de esa manera.Tenga en cuenta que
$$hashKey
es un detalle de implementación, no incluido en la API publicada para ng-repeat. Podrían eliminar el soporte de esa propiedad en cualquier momento. Pero probablemente no. :-)Invocar con:
EDITAR: el uso de una función como esta, que utiliza teclas en
$$hashKey
lugar de un nombre de propiedad específico del modelo, también tiene la ventaja adicional significativa de hacer que esta función sea reutilizable en diferentes modelos y contextos. Proporcione su referencia de matriz y su referencia de elemento, y debería funcionar.fuente
Usualmente escribo en ese estilo:
Espero que esto ayude. Debe usar un punto (.) Entre $ scope y [yourArray]
fuente
deleteCount
. Un entero que indica el número de elementos de matriz antiguos que se deben eliminar. Si deleteCount es 0, no se eliminan elementos. En este caso, debe especificar al menos un nuevo elemento. Si deleteCount es mayor que el número de elementos que quedan en la matriz comenzando al inicio, entonces todos los elementos hasta el final de la matriz serán eliminados. Array.prototype.splice () DocumentationSobre la base de la respuesta aceptada, esto va a trabajar con
ngRepeat
,filter
y expectativas manejar mejor:Controlador:
Ver:
fuente
implementación sin un controlador.
El método splice () agrega / elimina elementos a / de una matriz.
índice : obligatorio. Un número entero que especifica en qué posición agregar / eliminar elementos. Utilice valores negativos para especificar la posición desde el final de la matriz.
howmanyitem (s) : Opcional. El número de elementos que se eliminarán. Si se establece en 0, no se eliminarán elementos.
item_1, ..., item_n : Opcional. Los nuevos elementos que se agregarán a la matriz
fuente
No estoy de acuerdo con que deba llamar a un método en su controlador. Debe usar un servicio para cualquier funcionalidad real, y debe definir directivas para cualquier funcionalidad para la escalabilidad y la modularidad, así como asignar un evento de clic que contenga una llamada al servicio que inyecte en su directiva.
Entonces, por ejemplo, en tu HTML ...
Luego, crea una directiva ...
Entonces a su servicio ...
Cuando escriba su código correctamente de esta manera, hará que sea muy fácil escribir cambios futuros sin tener que reestructurar su código. Está organizado correctamente y maneja los eventos de clic personalizados correctamente mediante el enlace mediante directivas personalizadas.
Por ejemplo, si su cliente dice: "oye, ahora hagamos que llame al servidor y haga pan, y luego aparezca un modal". Podrá acceder fácilmente al servicio en sí mismo sin tener que agregar o cambiar ninguno de los códigos HTML o del método del controlador. Si solo tuviera una línea en el controlador, eventualmente necesitaría usar un servicio, para extender la funcionalidad al trabajo más pesado que solicita el cliente.
Además, si necesita otro botón 'Eliminar' en otro lugar, ahora tiene un atributo de directiva ('ng-remove-birthday') que puede asignar fácilmente a cualquier elemento de la página. Esto ahora lo hace modular y reutilizable. Esto será útil cuando se trate con el paradigma de componentes web PESADOS de Angular 2.0. No hay controlador en 2.0. :)
¡Feliz desarrollo!
fuente
Aquí hay otra respuesta. Espero que sea de ayuda.
La fuente completa está aquí
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice
fuente
Si tiene ID o cualquier campo específico en su artículo, puede usar filter (). actúa como Where ().
en el controlador:
fuente
desde el controlador (la función puede estar en el mismo controlador pero prefiere mantenerla en un servicio)
fuente