AngularJS Как удалить элемент из области действия
Простой список ToDo, но с кнопкой удаления на странице списка для каждого элемента!
![enter image description here]()
1. Соответствующий шаблон html:
<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>
2. Релевантный метод контроллера:
$scope.delete = function (person) {
API.DeletePerson({ id: person.id }, function (success) {
**// I NEED SOME CODE HERE TO PULL THE PERSON FROM MY SCOPE**
});
};
Я пробовал $scope.persons.pull(person)
Я попробовал $scope.persons.remove(person)
Хотя удаленный удаленный файл удален, я не могу вытащить этот элемент из области видимости, и я не хочу, чтобы вызов метода на сервер для данных был уже у клиента, я просто хочу удалить этого человека из области видимости.
Любые идеи?
Решение:
-
Для индекса использовался правильный подход в HTML:
-
Однако просто изменить параметр angular на (idx) было недостаточно, мне пришлось создать экземпляр этого человека для отправки на сервер для удаления.
$scope.delete = function (idx) {
var delPerson = $scope.persons[idx];
API.DeletePerson({ id: delPerson.id }, function (success) {
$scope.persons.splice(idx, 1);
});
};
Спасибо, ребята!
Angular БОЛЬШОЙ, и я призываю всех, кто еще не проверил это! };
Ответы
Ответ 1
Ваша проблема не связана с Angular, но с методами Array. Правильный способ удаления особого элемента из массива - Array.splice
. Кроме того, при использовании ng-repeat у вас есть доступ к специальному свойству $index
, которое является текущим индексом массива, который вы передали.
Решение на самом деле довольно просто:
Вид:
<a ng-click="delete($index)">Delete</a>
Контроллер:
$scope.delete = function ( idx ) {
var person_to_delete = $scope.persons[idx];
API.DeletePerson({ id: person_to_delete.id }, function (success) {
$scope.persons.splice(idx, 1);
});
};
Ответ 2
Вам нужно найти индекс person
в вашем массиве persons
, а затем использовать массив splice
метод
$scope.persons.splice( $scope.persons.indexOf(person), 1 );
Ответ 3
Я бы использовал библиотеку Underscore.js, в которой есть список хороших функций
without_.without(array, * values) Возвращает копию массива со всеми экземплярами удаленных значений.
_. без ([1, 2, 1, 0, 3, 1, 4], 0, 1); = > [2, 3, 4]
Пример
var res = "deleteMe";
$scope.nodes = [{
name: "Node-1-1"
}, {
name: "Node-1-2"
}, {
name: "deleteMe"
}];
$scope.newNodes = _.without($scope.nodes, _.findWhere($scope.nodes, {name: res}));
См. демонстрацию в Fiddle
фильтр (DOC)
var evens = _.filter([1, 2, 3, 4, 5, 6], функция (num) {return num% 2 == 0;});
= > [2, 4, 6]
Пример
$scope.newNodes = _.filter($scope.nodes, function(node) {
return !(node.name == res);
});
См. демонстрацию в Fiddle
Ответ 4
$scope.removeItem = function() {
$scope.items.splice($scope.toRemove, 1);
$scope.toRemove = null;
};
это работает для меня!
Ответ 5
Если у вас есть функция, связанная с списком, когда вы создаете функцию сращивания, ассоциация также удаляется. Мое решение:
$scope.remove = function() {
var oldList = $scope.items;
$scope.items = [];
angular.forEach(oldList, function(x) {
if (! x.done) $scope.items.push( { [ DATA OF EACH ITEM USING oldList(x) ] });
});
};
Параметр списка называется items.
Параметр x.done указывает, будет ли элемент удален.
Другие ссылки: Другой пример
Надеюсь помочь тебе. Привет.
Ответ 6
Для принятого ответа @Joseph Silber не работает, потому что indexOf возвращает -1. Вероятно, это связано с тем, что Angular добавляет hashkey, который отличается для моих $scope.items [0] и моего элемента. Я попытался разрешить это с помощью функции angular.toJson(), но это не сработало: (
А, я выяснил причину... Я использую метод chunk для создания двух столбцов в моей таблице, наблюдая за моими объектами $scope.items. Извините!
Ответ 7
Вы также можете использовать этот
$scope.persons = $filter('filter')($scope.persons , { id: ('!' + person.id) });
Ответ 8
Angular имеют встроенную функцию arrayRemove
, в вашем случае метод может быть просто:
arrayRemove($scope.persons, person)
Ответ 9
array.splice(array.pop(item));