Knockout.js — это легковесный JavaScript-фреймворк, предназначенный для реализации паттерна MVVM (Model-View-ViewModel) в веб-приложениях. Его ключевая задача — упрощение синхронизации данных между моделью и интерфейсом пользователя. Основой работы фреймворка являются observable объекты и привязки (bindings), которые автоматически обновляют интерфейс при изменении данных.
Для начала работы с Knockout.js необходимо подключить библиотеку к проекту. Существует два основных способа:
<head> или
перед закрывающим тегом <body>:<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.5.1/knockout-min.js"></script>
js/libs/knockout.js,
и подключается так:<script src="js/libs/knockout.js"></script>
После подключения скрипта можно приступать к созданию ViewModel и связыванию данных с интерфейсом.
ViewModel — это объект, который хранит состояние приложения и обеспечивает реактивность данных. Для создания ViewModel используются observable и observableArray.
function AppViewModel() {
this.firstName = ko.observable("Иван");
this.lastName = ko.observable("Иванов");
this.fullName = ko.computed(() => {
return this.firstName() + " " + this.lastName();
});
}
ko.observable() — создаёт реактивное свойство, которое
автоматически обновляет все привязки при изменении значения.ko.computed() — вычисляемое свойство, которое зависит
от других observables и пересчитывается при их изменении.После определения ViewModel необходимо связать его с DOM с помощью
функции ko.applyBindings().
const viewModel = new AppViewModel();
ko.applyBindings(viewModel);
Это действие связывает все элементы страницы, содержащие атрибуты
data-bind, с соответствующими свойствами ViewModel.
Пример привязки:
<div>
<input type="text" data-bind="value: firstName">
<input type="text" data-bind="value: lastName">
<p>Полное имя: <span data-bind="text: fullName"></span></p>
</div>
Ключевые моменты привязки:
value — синхронизация значения поля ввода с
observable.text — отображение текста из observable или
computed.Для работы с массивами используется ko.observableArray,
которая обеспечивает реактивность при добавлении, удалении и изменении
элементов.
function AppViewModel() {
this.items = ko.observableArray(["Элемент 1", "Элемент 2"]);
this.addItem = () => {
this.items.push("Новый элемент");
};
this.removeItem = (item) => {
this.items.remove(item);
};
}
Привязка к интерфейсу выполняется с помощью foreach:
<ul data-bind="foreach: items">
<li>
<span data-bind="text: $data"></span>
<button data-bind="click: $parent.removeItem">Удалить</button>
</li>
</ul>
<button data-bind="click: addItem">Добавить элемент</button>
$data — текущий элемент массива, $parent —
родительский ViewModel в контексте вложенных привязок.
Knockout.js позволяет легко связывать события DOM с методами
ViewModel через click, submit,
event и другие биндинги:
<form data-bind="submit: handleSubmit">
<input type="text" data-bind="value: firstName">
<button type="submit">Отправить</button>
</form>
this.handleSubmit = () => {
alert("Имя: " + this.firstName());
};
Использование таких привязок исключает необходимость ручного поиска
элементов через document.querySelector и добавления
обработчиков событий.
В крупных проектах рекомендуется делить ViewModel на модули и использовать require.js или другие системы модулей для организации кода. Каждый модуль экспортирует свои observables и методы, после чего основной ViewModel агрегирует их:
define(['module1', 'module2'], function(Module1, Module2) {
function MainViewModel() {
this.module1 = new Module1();
this.module2 = new Module2();
}
ko.applyBindings(new MainViewModel());
});
Это позволяет поддерживать код чистым, модульным и масштабируемым.
foreach. В таких случаях
рекомендуется использование template и виртуальных
элементов.Knockout.js обеспечивает плавное взаимодействие модели и интерфейса, минимизируя необходимость в ручном обновлении DOM и упрощая архитектуру веб-приложения. Эффективное подключение библиотеки и правильная организация ViewModel являются фундаментом стабильной работы реактивного интерфейса.