Knockout.js предоставляет мощный механизм двустороннего связывания данных, позволяющий автоматически синхронизировать модель и пользовательский интерфейс. Это означает, что любое изменение в модели немедленно отражается в интерфейсе, и наоборот — изменения в интерфейсе автоматически обновляют модель.
В центре работы двусторонних привязок находятся observable и observableArray.
var viewModel = {
name: ko.observable('Иван'),
tasks: ko.observableArray(['Купить продукты', 'Позвонить другу'])
};
observable()
уведомляет все связанные элементы интерфейса об изменении.Двусторонняя привязка осуществляется через data-bind:
<input data-bind="value: name, valueUpdate: 'input'" />
<p data-bind="text: name"></p>
name.<p>.При вводе нового текста в поле input значение
name автоматически изменяется, и все элементы, привязанные
к нему, обновляются мгновенно.
Для работы с коллекциями используется foreach:
<ul data-bind="foreach: tasks">
<li>
<span data-bind="text: $data"></span>
<button data-bind="click: $parent.removeTask">Удалить</button>
</li>
</ul>
viewModel.removeTask = function(task) {
viewModel.tasks.remove(task);
};
$parent используется для доступа к родительской модели
при вложенных структурах.Knockout.js позволяет привязывать пользовательские функции к событиям DOM:
<button data-bind="click: addTask">Добавить задачу</button>
viewModel.addTask = function() {
viewModel.tasks.push('Новая задача');
};
addTask.Для создания динамических вычислений, зависящих от других observable, используется computed:
viewModel.taskCount = ko.computed(function() {
return viewModel.tasks().length;
});
<p>Всего задач: <span data-bind="text: taskCount"></span></p>
tasks автоматически
пересчитывает taskCount.Knockout поддерживает условные привязки через visible и if:
<p data-bind="visible: tasks().length === 0">Задач нет</p>
<div data-bind="if: tasks().length > 0">
<ul data-bind="foreach: tasks">
<li data-bind="text: $data"></li>
</ul>
</div>
display, оставляя
элемент в DOM.Двусторонняя привязка работает не только с текстовыми полями:
<select data-bind="value: selectedTask, options: tasks"></select>
<p data-bind="text: selectedTask"></p>
viewModel.selectedTask = ko.observable();
<select>
обновляет selectedTask.selectedTask программно меняет выбранный
элемент в списке.Knockout позволяет создавать собственные привязки для нестандартных сценариев:
ko.bindingHandlers.uppercase = {
update: function(element, valueAccessor) {
var value = ko.unwrap(valueAccessor());
element.textContent = value.toUpperCase();
}
};
<p data-bind="uppercase: name"></p>
foreach для списков, что упрощает управление DOM.Эта система двусторонних привязок обеспечивает чистый, реактивный подход к построению интерфейсов, минимизируя необходимость в ручном управлении состоянием и обновлении DOM.