Я пытаюсь написать функцию, которая позволяет мне удалять элемент при нажатии кнопки, но я думаю, что меня смущает эта функция - использовать $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
том смысле, как у вас это не имеет контекста. Нужно больше подробностей в разметке, чтобы показать, что удаляется, и находится ли он внутриng-repeat
, откуда берется удаляемый элемент, или какое поведение вы хотитеremove()
Ответы:
Чтобы удалить элемент, вам нужно удалить его из массива и передать
bday
элемент в функцию удаления в разметке. Затем в контроллере найдите индекс элемента и удалите его из массива.Тогда в контроллере:
Angular автоматически обнаружит изменение в
bdays
массиве и выполнит обновлениеng-repeat
ДЕМО: http://plnkr.co/edit/ZdShIA?p=preview
РЕДАКТИРОВАТЬ: Если для выполнения прямых обновлений с сервером будет использоваться служба, которую вы создаете,
$resource
чтобы управлять обновлениями массива одновременно с сервером обновленийисточник
$index
напрямую может генерировать ошибки, если ваш список фильтруется по шаблону. Это шаблонная вещь; безопаснее использованияng-click='remove(bday)'
затемarr.splice(arr.indexOf(bday),1);
this is undefined
. Возможно, Plunker / JSFIDDLE?.indexOf(item)
вернет -1, если не найден, это может привести к удалению элемента в конце массива, если вы не проверите его.Это правильный ответ:
В ответе @ charlietfl. Я думаю, что это неправильно, поскольку вы передаете в
$index
качестве параметра, но вместо этого вы используете желание в контроллере. Поправьте меня если я ошибаюсь :)источник
indexOf
ТОЛЬКО работает, если это IE9 +Если вы находитесь внутри ng-repeat
Вы могли бы использовать один вариант лайнера
$index
используется angular для отображения текущего индекса массива внутриng-repeat
источник
Использование
$index
отлично работает в основных случаях, и ответ @ charlietfl великолепен. Но иногда$index
этого недостаточно.Представьте, что у вас есть один массив, который вы представляете в двух разных ng-repeat. Один из этих ng-repeat фильтруется для объектов, имеющих свойство truey, а другой - для свойства false. Представлены два разных отфильтрованных массива, которые происходят из одного исходного массива. (Или, если это помогает визуализировать: возможно, у вас есть один массив людей, и вам нужно одно ng-повторение для женщин в этом массиве и другое для мужчин в этом же массиве .) Ваша цель: надежно удалить из исходный массив, использующий информацию от членов отфильтрованных массивов.
В каждом из этих отфильтрованных массивов $ index не будет индексом элемента в исходном массиве. Это будет индекс в отфильтрованном подмассиве . Таким образом, вы не сможете узнать индекс человека в исходном
people
массиве, вы будете знать только индекс $ из подмассиваwomen
илиmen
. Попробуйте удалить, используя это, и у вас будут предметы, исчезающие отовсюду, за исключением того, что вы хотели. Что делать?Если вам повезло, вы используете модель данных, содержащую уникальный идентификатор для каждого объекта, а затем используйте его вместо $ index, чтобы найти объект и
splice
его значение вне основного массива. (Используйте мой пример ниже, но с этим уникальным идентификатором.) Но если вам не так повезло?Angular фактически увеличивает каждый элемент в массиве с повторением ng (в основном, исходном массиве) уникальным свойством, которое называется
$$hashKey
. Вы можете найти в исходном массиве совпадение с$$hashKey
элементом, который хотите удалить, и таким образом избавиться от него.Обратите внимание, что
$$hashKey
это деталь реализации, не включенная в опубликованный API для ng-repeat. Они могут удалить поддержку этого свойства в любое время. Но, вероятно, нет. :-)Вызвать с:
РЕДАКТИРОВАТЬ: Использование подобной функции, в которой
$$hashKey
вместо имени специфичного для модели ключа используется ключ , также имеет существенное дополнительное преимущество, заключающееся в возможности многократного использования этой функции в различных моделях и контекстах. Укажите в нем ссылку на массив и ссылку на элемент, и она должна просто работать.источник
Я обычно пишу в таком стиле:
Надеюсь, что это поможет Вам использовать точку (.) Между $ scope и [yourArray]
источник
deleteCount
. Целое число, указывающее количество удаляемых старых элементов массива. Если deleteCount равен 0, элементы не удаляются. В этом случае вы должны указать хотя бы один новый элемент. Если deleteCount больше, чем количество элементов, оставшихся в массиве, начиная с начала, то все элементы до конца массива будут удалены. Array.prototype.splice () ДокументацияОсновываясь на общепринятом ответ, это будет работать с
ngRepeat
,filter
и ручки лучше ожиданиях:контроллер:
Посмотреть:
источник
реализация без контроллера.
Метод splice () добавляет / удаляет элементы в / из массива.
индекс : обязательно. Целое число, указывающее, в какой позиции добавлять / удалять элементы. Используйте отрицательные значения, чтобы указать позицию в конце массива.
howmanyitem (s) : Необязательно. Количество предметов, которые будут удалены. Если установлено значение 0, элементы не будут удалены.
item_1, ..., item_n : необязательно. Новый элемент (ы) для добавления в массив
источник
Я не согласен с тем, что вы должны вызывать метод на вашем контроллере. Вы должны использовать сервис для любой реальной функциональности, и вы должны определить директивы для любой функциональности для масштабируемости и модульности, а также назначить событие click, которое содержит вызов сервиса, который вы вводите в свою директиву.
Так, например, на вашем HTML ...
Затем создайте директиву ...
Тогда к вашим услугам ...
Когда вы правильно напишите свой код, вы очень легко сможете написать будущие изменения без необходимости реструктуризации кода. Он организован правильно, и вы обрабатываете пользовательские события кликов правильно, связывая их с помощью пользовательских директив.
Например, если ваш клиент говорит: «Эй, теперь давайте сделаем так, чтобы он вызывал сервер и делал хлеб, а затем выскакивал модально». Вы сможете легко перейти к самой службе, не добавляя и не изменяя HTML-код и / или код метода контроллера. Если бы у вас была только одна строка на контроллере, вам в конечном итоге понадобилось бы использовать службу для расширения функциональности до более тяжелой работы, которую требует клиент.
Также, если вам нужна еще одна кнопка «Удалить» в другом месте, теперь у вас есть атрибут директивы («ng-remove-birthday»), который вы можете легко назначить любому элементу на странице. Это теперь делает его модульным и многоразовым. Это пригодится при работе с парадигмой веб-компонентов HEAVY в Angular 2.0. Там нет контроллера в 2.0. :)
Счастливого развития !!!
источник
Вот еще один ответ. Надеюсь, это поможет.
Полный источник здесь
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice
источник
если у вас есть идентификатор или какое-либо конкретное поле в вашем элементе, вы можете использовать filter (). его действие как где ().
в контроллере:
источник
от контроллера (функция может быть в том же контроллере, но предпочитать хранить ее в сервисе)
источник