Prosta lista rzeczy do zrobienia, ale z przyciskiem usuwania na stronie listy dla każdego elementu:
Odpowiedni kod HTML szablonu:
<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>
Odpowiednia metoda kontrolera:
$scope.delete = function (person) {
API.DeletePerson({ id: person.id }, function (success) {
// I need some code here to pull the person from my scope.
});
};
Próbowałem $scope.persons.pull(person)
i $scope.persons.remove(person)
.
Chociaż baza danych została pomyślnie usunięta, nie mogę wyciągnąć tego elementu z zakresu i nie chcę wykonywać wywołania metody do serwera w celu uzyskania danych, które klient już posiada, po prostu chcę usunąć tę jedną osobę z zakresu.
Jakieś pomysły?
Odpowiedzi:
Twój problem nie dotyczy tak naprawdę Angulara, ale metod Array. Właściwym sposobem usunięcia konkretnego elementu z tablicy jest
Array.splice
. Ponadto, używając ng-repeat, masz dostęp do specjalnej$index
właściwości, którą jest bieżący indeks przekazanej tablicy.Rozwiązanie jest w rzeczywistości dość proste:
Widok:
Kontroler:
źródło
indexOf
może być droższa; bez filtrowania jest to całkowicie niepotrzebne. Ale z filtrowaniemindexOf
byłaby odpowiednia metoda.Będziesz musiał znaleźć indeks tablicy
person
w swojejpersons
tablicy, a następnie użyć metody tablicysplice
:źródło
Chciałbym użyć underscore.js bibliotekę, która ma listę przydatnych funkcji.
without
Przykład
Zobacz Demo w JSFiddle .
filter
Przykład
Zobacz demo w Fiddle .
źródło
$scope.nodes = _.without($scope.nodes, node);
ponieważ ma odniesienie donode
Array.prototype.filter
._.filter(array, fun)
staje sięarray.filter(fun)
.to działa dla mnie!
źródło
Jeśli masz jakąś funkcję skojarzoną z listą, podczas tworzenia funkcji łączenia, skojarzenie również zostanie usunięte. Moje rozwiązanie:
Parametr listy nosi nazwę items . Parametr x.done wskazuje, czy element zostanie usunięty.
Inne odniesienia: inny przykład
Mam nadzieję, że ci pomogę. Pozdrowienia.
źródło
Dla zaakceptowanej odpowiedzi @Joseph Silber nie działa, ponieważ indexOf zwraca -1. Dzieje się tak prawdopodobnie dlatego, że Angular dodaje klucz skrótu, który jest inny dla mojego $ scope.items [0] i dla mojego elementu. Próbowałem rozwiązać ten problem za pomocą funkcji angular.toJson (), ale to nie zadziałało :(
Ach, znalazłem przyczynę ... Używam metody fragmentów, aby utworzyć dwie kolumny w mojej tabeli, obserwując moje $ scope.items. Przepraszam!
źródło
Możesz również użyć tego
źródło
Angular ma wbudowaną funkcję o nazwie
arrayRemove
, w twoim przypadku metodą może być po prostu:źródło
źródło
Aby usunąć element z zakresu, użyj:
Od wprowadź opis linku tutaj
źródło