Компоненты в Knockout.js предоставляют мощный механизм для создания
повторно используемых и изолированных блоков пользовательского
интерфейса. Каждый компонент может принимать параметры,
которые определяют его поведение и внешний вид. Параметры передаются в
компонент через объект params при его подключении.
<my-component params="title: 'Пример', count: 5"></my-component>
В данном примере компонент my-component получает два
параметра: строку title и число count. Внутри
компонента эти параметры становятся доступными через объект
params.
ko.components.register('my-component', {
viewModel: function(params) {
this.title = ko.observable(params.title || 'Заголовок по умолчанию');
this.count = ko.observable(params.count || 0);
},
template: `
<h2 data-bind="text: title"></h2>
<p data-bind="text: count"></p>
`
});
Ключевой особенностью является возможность использовать
значения по умолчанию, если параметр не был передан.
Для этого применяется стандартная логика JavaScript (||),
либо ko.unwrap при работе с возможными
observable.
Параметры компонентов часто должны быть реактивными,
чтобы изменения снаружи автоматически отражались внутри компонента.
Knockout.js позволяет привязывать observable напрямую:
<my-component params="count: itemCount"></my-component>
function AppViewModel() {
this.itemCount = ko.observable(10);
}
ko.applyBindings(new AppViewModel());
Внутри компонента params.count будет ссылкой на
itemCount, и любое изменение значения снаружи сразу
отразится на компоненте.
Валидация параметров позволяет контролировать корректность данных, передаваемых в компонент. Наиболее часто встречаются три подхода:
Проверка типов данных
Используется для обеспечения соответствия переданного значения ожидаемому типу:
function MyComponentViewModel(params) {
if (params.title && typeof ko.unwrap(params.title) !== 'string') {
throw new Error('Параметр title должен быть строкой');
}
this.title = ko.observable(params.title || 'Заголовок по умолчанию');
}
Здесь ko.unwrap позволяет корректно обрабатывать как
обычные значения, так и observable.
Проверка обязательных параметров
Если компонент требует наличие определённого параметра:
function MyComponentViewModel(params) {
if (!params.count) {
throw new Error('Параметр count обязателен');
}
this.count = ko.observable(params.count);
}
Это защищает компонент от некорректного использования.
Комплексная валидация через сторонние библиотеки
Knockout.js совместим с Knockout Validation для более
сложных проверок. Пример использования:
this.count = ko.observable(params.count).extend({ required: true, min: 0, max: 100 });
Валидация позволяет автоматически отображать сообщения об ошибках и предотвращать некорректное использование данных.
Для гибкости рекомендуется комбинировать значения по умолчанию и динамическую инициализацию. Например, если параметр может быть объектом с несколькими полями:
function MyComponentViewModel(params) {
const defaults = {
title: 'Заголовок',
count: 0,
enabled: true
};
const actualParams = Object.assign({}, defaults, ko.unwrap(params));
this.title = ko.observable(actualParams.title);
this.count = ko.observable(actualParams.count);
this.enabled = ko.observable(actualParams.enabled);
}
Такой подход гарантирует, что компонент всегда будет иметь корректные значения даже при неполном наборе параметров.
В шаблоне компонента параметры доступны через привязку
data-bind. Основные варианты:
<h2 data-bind="text: title"></h2>
<p data-bind="visible: enabled">Компонент активен</p>
<button data-bind="click: function() { count(count() + 1) }">Увеличить</button>
Параметры могут быть использованы не только как
observable, но и как обычные значения, что обеспечивает
максимальную гибкость.
Понимание работы с параметрами и их валидации позволяет создавать компоненты Knockout.js, которые будут надёжными, гибкими и легко повторно используемыми.