#javascript #angularjs
#javascript #angularjs
Вопрос:
У меня есть 2 списка.
У меня есть служба Angular с splice
методом на основе a, который позволяет мне удалять элементы из первого списка (называемые « items
«) на основе их индекса с помощью ng-click
действия.
service.removeItem = function (itemIndex) {
items.splice(itemIndex, 1);
};
Что я хотел бы сделать, так это добавить удаленный элемент во 2-й список (называемый « bought
«), используя тот же индекс, который передается slice
.
Я подумал, что, возможно, я мог бы поместить эту функциональность в ту же функцию ( removeItem
), как это:
service.removeItem = function (itemIndex) {
bought.push(itemIndex);
items.splice(itemIndex, 1);
};
Однако, похоже, это не работает. Я безуспешно попробовал несколько вариантов (например bought.push(items.itemIndex)
).
Ответ №1:
Используется splice
для вставки удаляемого элемента с тем же индексом во второй массив.
service.removeItem = function (itemIndex) {
var currItem = items[itemIndex];
// Insert the element to be removed
// at the same index in the other array
bought.splice(itemIndex, 0, currItem);
items.splice(itemIndex, 1);
};
или вместо того, чтобы обращаться к элементу заранее, используйте тот, который возвращается при удалении элемента.
service.removeItem = function (itemIndex) {
var currItem = items.splice(itemIndex, 1);
bought.splice(itemIndex, 0, currItem);
};
Ответ №2:
Вызов splice удаляет элемент из массива, что хорошо. Он возвращает элемент, который он удалил. Смотрите документ здесь: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/splice
Таким образом, ваша функция removeItem может выглядеть следующим образом:
service.removeItem = function (itemIndex) {
var removedItem = items.splice(itemIndex, 1);
bought.push(removedItem);
};
Проблема в том, что вы заставляете метод removeItem выполнять 2 действия одновременно. Возможно, было бы лучше переименовать его, чтобы отразить то, что он делает (например, «buyItem»).
Или иметь функцию более высокого уровня, которая делает это
service.buyItem = function (itemIndex) {
bought.push(removeItem(itemIndex);
}
service.removeItem = function (itemIndex) {
return items.splice(itemIndex, 1);
};
Таким образом, ваша функция removeItem является чистой в том, что она делает, и может использоваться в другом месте
Комментарии:
1. Спасибо, Майк. Я думаю, что вы абсолютно правы в первой части. Я не знаю, смогу ли я разделить добавление и удаление на 2 разные функции, потому что при нажатии кнопки для удаления элемента из первого списка он должен появиться во 2-м списке. Я не хочу вводить еще одну кнопку. Или можно предоставить 2 разные функции
ng-click
? Извините, если это очевидно, я всего неделю изучаю Angular.2. Это не имеет большого значения, обычно кто-то, пишущий сервис, предполагает продвинутый уровень, потому что сервисы можно довольно легко использовать из других мест в коде — обычно люди помещают служебные функции в сервисы. Если вы просто дадите ему более описательное имя, тогда все будет хорошо. Вы можете стать полностью профессионалом на следующей неделе 🙂