Knockout.js — это библиотека JavaScript, обеспечивающая двустороннюю привязку данных между моделями и представлением. Центральной концепцией являются observable объекты и привязки (bindings), позволяющие управлять DOM напрямую через состояние модели. Работа с DOM элементами через привязки позволяет избегать ручного обновления интерфейса и делает код более чистым и поддерживаемым.
В Knockout.js связывание модели с DOM осуществляется с помощью
атрибута data-bind. Синтаксис выглядит следующим
образом:
<span data-bind="text: name"></span>
<input data-bind="value: name" />
Здесь ключевое: каждое свойство модели, которое может изменяться, должно быть observable. Например:
var viewModel = {
name: ko.observable("Иван")
};
ko.applyBindings(viewModel);
ko.observable — создаёт объект, который отслеживает
изменения значения.text — привязка, которая автоматически обновляет
текстовое содержимое элемента.value — привязка, синхронизирующая значение input с
observable.Любое изменение viewModel.name моментально отражается в
DOM.
Knockout позволяет управлять любыми атрибутами HTML-элементов через
привязку attr:
<img data-bind="attr: { src: imageUrl, alt: imageAlt }" />
var viewModel = {
imageUrl: ko.observable("avatar.png"),
imageAlt: ko.observable("Аватар пользователя")
};
attr принимает объект, где ключ — имя атрибута, а
значение — observable или обычное свойство.Visible и css — мощные инструменты для динамического управления стилями:
<div data-bind="visible: isVisible, css: { active: isActive }">
Контент блока
</div>
var viewModel = {
isVisible: ko.observable(true),
isActive: ko.observable(false)
};
visible управляет свойством display.css позволяет добавлять или удалять классы на основе
состояния observable.Knockout предоставляет привязку event для управления
событиями DOM:
<button data-bind="event: { click: onClick }">Нажми меня</button>
var viewModel = {
onClick: function() {
alert("Кнопка нажата");
}
};
addEventListener.<div data-bind="event: { mouseover: onHover, mouseout: onLeave }"></div>
Для генерации списков DOM используется foreach:
<ul data-bind="foreach: items">
<li data-bind="text: $data"></li>
</ul>
var viewModel = {
items: ko.observableArray(["Элемент 1", "Элемент 2", "Элемент 3"])
};
observableArray — массив, изменения которого
(добавление, удаление) автоматически обновляют DOM.foreach $data ссылается на текущий
элемент массива.$index можно использовать для получения индекса
текущего элемента.Привязка template позволяет использовать кастомные
шаблоны:
<script type="text/html" id="item-template">
<span data-bind="text: name"></span>
</script>
<div data-bind="template: { name: 'item-template', data: currentItem }"></div>
var viewModel = {
currentItem: ko.observable({ name: "Элемент A" })
};
template облегчает работу с повторяющимися структурами
DOM.data указывает на объект, который будет использоваться
внутри шаблона.if и ifnotПривязки if и ifnot позволяют условно
рендерить элементы:
<div data-bind="if: isLoggedIn">
Добро пожаловать, пользователь!
</div>
<div data-bind="ifnot: isLoggedIn">
Пожалуйста, войдите в систему.
</div>
var viewModel = {
isLoggedIn: ko.observable(false)
};
visible, if полностью
добавляет или удаляет элементы из DOM.custom bindingKnockout поддерживает создание пользовательских привязок:
ko.bindingHandlers.colorize = {
update: function(element, valueAccessor) {
var value = ko.unwrap(valueAccessor());
element.style.color = value;
}
};
<p data-bind="colorize: textColor">Текст</p>
var viewModel = {
textColor: ko.observable("red")
};
update вызывается при каждом изменении observable.ko.unwrap позволяет получить значение observable или
обычного свойства.Knockout хорошо работает с вложенными объектами:
<div data-bind="with: user">
<h2 data-bind="text: name"></h2>
<p data-bind="text: email"></p>
</div>
var viewModel = {
user: ko.observable({ name: "Иван", email: "ivan@example.com" })
};
with переключает контекст на вложенный
объект.Computed observables помогают вычислять значения на основе других observable:
<p data-bind="text: fullName"></p>
var viewModel = {
firstName: ko.observable("Иван"),
lastName: ko.observable("Иванов"),
fullName: ko.computed(function() {
return this.firstName() + " " + this.lastName();
}, this)
};
computed автоматически отслеживает все
зависимости.Knockout.js обеспечивает мощный и гибкий механизм взаимодействия с DOM, позволяя управлять атрибутами, стилями, событиями, шаблонами и структурой элементов на основе состояния модели. Привязки делают код декларативным, сокращают количество ручных манипуляций и обеспечивают реактивность интерфейса.