Обратные вызовы привязки foreach

Последнее обновление: 17.05.2016

Привязка foreach позволяет использовать ряд функций обратного вызова, которые вызываются при возникновении тех или иных событий:

  • afterRender: вызывается, когда сработала самая первая инициализация привязки foreach, и также срабатывает при добавлении нового элемента в массив

  • afterAdd: срабатывает каждый раз при добавлении нового элемента в массив

  • beforeRemove: срабатывает перед удалением элемента из массива. Как правило, используется для анимации удаления

  • beforeMove: вызывается до перемещения элемента внутри массива

  • afterMove: вызывается после перемещения элемента внутри массива

Как правило, функции обратного вызова служат для анимации элементов. Все они принимают три параметра:

  • Изменяемый элемент структуры DOM на веб-странице, который был добавлен (afterAdd), удален (beforeRemove) или перемещен (beforeMove / afterMove)

  • Индекс изменяемого элемента в массиве

  • Изменяемый элемент самого массива, который был добавлен (afterAdd), удален (beforeRemove) или перемещен (beforeMove / afterMove)

Пример анимации добавляемого элемента с помощью методов обратного вызова:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Привязка массивов в KnockoutJS</title>
</head>
<body>
<ul data-bind="foreach: { data: phones, afterAdd: displayItem }">
	<li>
		<p data-bind="text: name"></p>
		<p data-bind="text: company"></p>
	</li>
</ul>
<button id="addItemBtn">Добавить</button>
<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.10.1.min.js"></script>
<script type="text/javascript" src="https://ajax.aspnetcdn.com/ajax/knockout/knockout-3.4.0.js"></script>
<script>
function Phone(name, company){
	this.name = name;
	this.company = company;
};

var viewModel ={
	phones:  ko.observableArray([
		new Phone("iPhone 6S", "Apple"), 
		new Phone("Lumia 950", "Microsoft"),
		new Phone("Nexus 6P","Huawei")
	]),
	displayItem: function(element, index, data) {
		
		$(element).filter("li").css("opacity", 0.1);
		$(element).filter("li").fadeTo(2000, 1.0);
	}
};
ko.applyBindings(viewModel);

var addItemBtn = document.getElementById("addItemBtn");
addItemBtn.addEventListener("click", function (e) {
    viewModel.phones.push(new Phone("Samsung", "Galaxy S7 Edge"));
});

</script>
</body>
</html>

Для анимации вначале подключается библиотека jquery. Сама анимация определена в функции displayItem:

displayItem: function(element, index, data) {
		
	$(element).filter("li").css("opacity", 0.1);
	$(element).filter("li").fadeTo(2000, 1.0);
}

То есть сначала устанавливает почти полная прозрачность, а затем она уменьшается в течение 2000 миллисекунд.

Сама же привязка принимает следующую форму:

data-bind="foreach: { data: phones, afterAdd: displayItem }"
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850