Почему в сети нет примера с взаимоисключающими флажками
Поскольку эта ссылка появилась первой, когда я искал взаимоисключающие флажки, я поделюсь своим ответом здесь. Я бился головой о стену со всеми своими попытками. Кстати, когда вы обрабатываете событие click в связывающем in-line knockoutjs, кажется, что он отключает привязки (возможно, только потому, что я пытался вызвать функцию resetIllness, как определено ниже), даже если вы возвращаете true из функции. Может быть, есть лучший способ, но до тех пор следуй моему примеру.
Вот тип, который мне нужно связать.
var IllnessType = function (name,title) {
this.Title = ko.observable(title);
this.Name = ko.observable(name);
this.IsSelected = ko.observable(false);
};
Массив для привязки.
model.IllnessTypes = ko.observableArray(
[new IllnessType('IsSkinDisorder', 'Skin Disorder'),
new IllnessType('IsRespiratoryProblem', 'Respiratory Problem'),
new IllnessType('IsPoisoning', 'Poisoning'),
new IllnessType('IsHearingLoss', 'Hearing Loss'),
new IllnessType('IsOtherIllness', 'All Other Illness')]
);
Функция сброса болезни, чтобы очистить их всех.
model.resetIllnesses = function () {
ko.utils.arrayForEach(model.IllnessTypes(), function (type) {
type.IsSelected(false);
});
};
Наценка
<ul data-bind="foreach:IllnessTypes,visible: model.IsIllness()">
<li><label data-bind="html: Title"></label></li>
<li><input class="checkgroup2" type="checkbox"
data-bind="attr:{name: Name },checked:IsSelected" /></li>
</ul>
Это просто не работает
Если вы пытались вызвать функцию resetIllness, как показано ниже, вы почувствуете мою боль.
<input type='checkbox' data-bind="checked:IsSelected,
click: function() { model.resetIllnesses(); return true; }" />
ты разделяешь мою боль. Ну, это работает! когда вы звоните из следующего примера.
Обратите внимание, что есть класс, который я добавил выше, чтобы я мог добавить функцию щелчка.
Сценарий, который устраняет все ваши проблемы.
<script type="text/javascript">
$(function() {
$(".checkgroup2").on('click', function() {
model.resetIllnesses();
var data = ko.dataFor(this);
data.IsSelected(true);
});
});
</script>
Отправить информацию на сервер
Кроме того, в моем случае мне пришлось отправлять информацию на сервер не так, как по умолчанию в формате html, поэтому я немного изменил входные данные.
<input class="checkgroup2" type="checkbox" data-bind="checked:IsSelected" />
<input type="hidden" data-bind="attr:{name: Name },value:IsSelected" />