我有一个复选框列表,其中一个是"其他"而我想要的是,如果"其他"选中,然后启用文本框。如果"其他"如果未选中,则必须禁用文本框,并且必须清除其内容。
现在,问题是当我点击"其他"复选框,复选标记不会显示或消失直到我触发另一个绑定事件。我必须通过将Click事件处理程序添加到"其他"复选框。
HTML
<input type='checkbox' value='apple' data-bind='checked: selectedFoods' />apple
<br>
<input type='checkbox' value='banana' data-bind='checked: selectedFoods' />banana
<br>
<input type='checkbox' value='other' data-bind='checked: selectedFoods, event: {click: otherClicked}' />other
<input type='text' data-bind="text: otherFoods, attr:{disabled: selectedFoods.indexOf('other') < 0}" />
JS
$(document).ready(function () {
var BaseVM = function () {
var that = {};
return that;
};
var TestVM = function () {
var that = BaseVM();
that.selectedFoods = ko.observableArray(['apple', 'banana']);
that.otherFoods = ko.observable(null);
that.otherClicked = function () {
if (that.selectedFoods.indexOf('other') < 0) {
that.otherFoods = '';
}
};
return that;
};
var vm = TestVM();
ko.applyBindings(vm);
});
答案 0 :(得分:1)
这一行
that.otherFoods = '';
错了。您需要将值指定为可观察值,因为它就是这样:
that.otherFoods('');
此外,您需要在检查值时评估数组:
that.selectedFoods.indexOf('other') < 0
应该是
that.selectedFoods().indexOf('other') < 0
编辑:您的点击处理程序设置错误,请参阅此更新的小提琴:
http://jsfiddle.net/2qdu9tuo/9/
您需要在单击处理程序中返回true,以使复选框仍然像复选框一样。此外,您正在使用文本绑定而不是文本框上的值绑定。
答案 1 :(得分:1)
首先,您需要return true
处理程序中的click
,否则原生事件不会传播,复选框状态也不会更改。
此外,重置otherFoods
observable时,需要调用observable,而不是覆盖它:
that.otherClicked = function () {
if (that.selectedFoods.indexOf('other') < 0)
that.otherFoods('');
return true;
};
另一个问题是,您使用text
绑定处理程序代替otherFoods
处理程序而不是value
处理程序:
<input type='text' data-bind="value: otherFoods, attr:{disabled: selectedFoods.indexOf('other') < 0}" />
请参阅Fiddle