Привязка checked

Последнее обновление: 17.05.2016

Привязка checked предназначена для работы с элементами input с типом checkbox и radio, которые могут пребывать в отмеченном или неотмеченном состоянии. Фактически создается привязка к атрибуту checked.

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Привязка в KnockoutJS</title>
<script type="text/javascript" src="https://ajax.aspnetcdn.com/ajax/knockout/knockout-3.4.0.js"></script>
</head>
<body>
<p><input type="checkbox" data-bind="checked: isVisible" /><span>Видимый</span></p>
<div data-bind="visible: isVisible">
    Скрываемый блок
</div>
 
<script type="text/javascript">
    var viewModel = {
        isVisible: ko.observable(true)
    };
 ko.applyBindings(viewModel);

</script>
</body>
</html>

Для параметра checked надо передать объект, который представляет логическое значение false или true. Это логическое значение будет указывать, отмечен ли флажок или нет. И как раз таким объектом в нашем случае является свойство isVisible.

В итоге устанавливая или снимая отметку в поле, мы можем управлять атрибутом checked и тем самым значением свойства isVisible. А так как isVisible также привязан к блоку div и устанавливает видимость этого блока, то через установку отметки флажка мы можем влиять на видимость этого блока:

Привязка checked и checkbox в Knockout

Создание набора флажков:

<ul data-bind="foreach: { data: phones, as: 'phone'}">
	<li>
		<input type="checkbox" data-bind="checked: phone.isAvailable" /> 
		<span data-bind="text: phone.model"></span>
	</li>
</ul>
<script type="text/javascript">
function Phone(model, available){
	this.model = model;
	this.isAvailable = available;
}
    var viewModel = {
        phones: ko.observableArray([
			new Phone("iPhone SE", true),
			new Phone("Lumia 950", false),
			new Phone("Zenfone 3", true),
			new Phone("Xiaomi Mi5", false)
		])
    };
 ko.applyBindings(viewModel);
</script>
Набор чекбоксов в Knockout

Немного иначе происходит работа с радиокнопками:

<div data-bind="foreach: phones">
	<p>
		<input type="radio" name="phone" data-bind="checkedValue: $data, checked: $root.isSelected" /> 
		<span data-bind="text: $data"></span>
	</p>
</div>
 
<script type="text/javascript">
function Phone(model, selected){
	this.model = model;
}
    var viewModel = {
        phones: ko.observableArray(["iPhone SE", "Lumia 950", "Zenfone 3", "Xiaomi Mi5"]),
		isSelected: ko.observable("Lumia 950")
    };
 ko.applyBindings(viewModel);

</script>

Здесь выражение привязки выглядит следующим образом:

data-bind="checkedValue: $data, checked: $root.isSelected"

Параметр checkedValue указывает на объект, который будет применяться для атрибута value. То есть так как перебираемый массив представляет практически массив строк, то каждая строка будет передаваться через объект $data и будет представлять значение для атрибута value.

Кроме того, для параметра checked в качестве значения устанавливается объект, который соответствует значению атрибута value. То есть здесь в качестве такого объекта используется isSelected, который соответствует второму элементу массива. Ну и так как при переборе массива каждый элемент input в качестве контекста принимает перебираемый объект, то нам надо использовать ключевое слово $root для обращения к свойству в родительском контексте: $root.isSelected

В итоге второй элемент будет выбран по умолчанию:

Набор радиокнопок в Knockout
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850