Knockout.js — это JavaScript-фреймворк для реализации шаблонов данных с использованием подхода MVVM (Model-View-ViewModel). Его главная цель — упрощение синхронизации пользовательского интерфейса с данными, благодаря реактивной привязке и автоматическому обновлению представлений при изменении модели.
Ключевые концепции Knockout.js:
Создание observable выполняется с помощью функции
ko.observable():
var firstName = ko.observable('Иван');
firstName('Пётр'); // обновление значения
console.log(firstName()); // чтение значения
Observable массивы создаются через
ko.observableArray():
var items = ko.observableArray(['Яблоко', 'Банан']);
items.push('Апельсин'); // добавление элемента
items.remove('Банан'); // удаление элемента
Вычисляемые observables позволяют задавать динамические зависимости между значениями:
var firstName = ko.observable('Иван');
var lastName = ko.observable('Иванов');
var fullName = ko.computed(function() {
return firstName() + ' ' + lastName();
});
console.log(fullName()); // "Иван Иванов"
firstName('Пётр');
console.log(fullName()); // "Пётр Иванов"
Knockout.js использует declarative bindings. Основные виды привязки:
text — вывод текста из observable в элемент:<span data-bind="text: firstName"></span>
value — связывает значение формы с observable:<input data-bind="value: firstName">
visible и hidden — управление
видимостью:<div data-bind="visible: isVisible">Контент</div>
foreach — циклический вывод элементов массива:<ul data-bind="foreach: items">
<li data-bind="text: $data"></li>
</ul>
click — привязка событий:<button data-bind="click: addItem">Добавить элемент</button>
ViewModel — это объект, содержащий данные и методы, с которыми взаимодействует пользовательский интерфейс:
function AppViewModel() {
this.firstName = ko.observable('Иван');
this.lastName = ko.observable('Иванов');
this.items = ko.observableArray(['Яблоко', 'Банан']);
this.addItem = () => {
this.items.push('Апельсин');
};
}
ko.applyBindings(new AppViewModel());
ko.applyBindings() связывает ViewModel с DOM, начиная
отслеживание изменений и обновление элементов интерфейса.
ko.bindingHandlers.fadeVisible = {
init: function(element, valueAccessor) {
var shouldDisplay = ko.unwrap(valueAccessor());
$(element).toggle(shouldDisplay);
},
update: function(element, valueAccessor) {
var shouldDisplay = ko.unwrap(valueAccessor());
$(element).fadeToggle(shouldDisplay);
}
};
<div data-bind="template: { name: 'itemTemplate', foreach: items }"></div>
<script type="text/html" id="itemTemplate">
<p data-bind="text: $data"></p>
</script>
firstName.subscribe(function(newValue) {
console.log('Имя изменилось на', newValue);
});
Knockout.js легко интегрируется с AJAX-запросами и сторонними
библиотеками. Для загрузки данных используется стандартный
fetch или jQuery.ajax, а результаты
сохраняются в observable или observableArray:
fetch('/api/items')
.then(response => response.json())
.then(data => viewModel.items(data));
computed для всех зависимых значений,
чтобы избежать ручного обновления интерфейса.observableArray для всех массивов, которые
могут динамически изменяться.subscribe) использовать только для побочных
эффектов, избегая изменения других observables внутри.Knockout.js обеспечивает реактивность и упрощает управление сложными интерфейсами без необходимости полностью переходить на более тяжёлые фреймворки. Его ключевое преимущество — простая декларативная привязка данных и минимальная конфигурация.