我有一个复选框字段和一个输入字段(endDate
)。我想启用和禁用endDate
取决于复选框值(选中复选框后,endDate
被禁用,反之亦然)。我有输入和复选框元素如下:
<input id="inUse" type="checkbox" data-bind="checked: inUse"/> <input id="endDate" data-bind="datepicker: enDate, enable: enableEndDate"/>
enableEndDate:
self.enableEndDate = ko.computed(function(){ return !inUse(); } });
加载页面时,取决于inUse
字段值,endDate
将启用或禁用。当我取消选中inUse
时,endDate
将被启用。
现在,我希望在用户点击它时启用已禁用的endDate
,然后将inUse
的值更改为同时取消选中。我怎样才能绑定这个双向过程?
答案 0 :(得分:0)
您的要求是:
inUse
复选框,则应启用或禁用文本框,具体取决于复选框状态首先,如果您禁用文本框,它将不会抛出事件,因此无法知道用户何时单击它。因此,您需要使用readonly
,而不是disabled
。单击只读文本框时,会触发单击事件。
Knockout没有readonly绑定。您可以使用通用attr
绑定,或创建一个readonly
处理程序,这非常简单:
// Add new binding handler for readonly
ko.bindingHandlers['readonly'] = {
'update': function (element, valueAccessor) {
var value = !!ko.utils.unwrapObservable(valueAccessor());
if(value !== element.readOnly)
element.readOnly = value;
}
};
必须在加载挖空库之后以及绑定视图模型之前运行。您可以将readonly
用作任何内置处理程序。
此外,您可以修改CSS以明确禁用文本框,例如:
/* Make visible when the control is disabled */
input[readonly] {
background-color: #EEE;
}
然后,故事的其余部分非常简单。这是视图模型和绑定:
var vm = (function() {
var inUse = ko.observable(false);
var endDate = ko.observable(null);
var endDateClick = function() {
console.log('Clicked!');
if (!inUse()) inUse(true);
};
return {
inUse: inUse,
endDate: endDate,
endDateClick: endDateClick
}
})();
ko.applyBindings(vm);
这是相应的HTML:
<input id="inUse" type="checkbox" data-bind="checked: inUse"/>
<input id="endDate" data-bind="value: endDate, readonly: !inUse(), click: endDateClick"/>
您可以在this fiddle中看到它正常工作。或直接:
// Add new binding handler for readonly
ko.bindingHandlers['readonly'] = {
'update': function (element, valueAccessor) {
var value = !!ko.utils.unwrapObservable(valueAccessor());
if(value !== element.readOnly)
element.readOnly = value;
}
};
var vm = (function() {
var inUse = ko.observable(false);
var endDate = ko.observable(null);
var endDateClick = function() {
console.log('Clicked!');
if (!inUse()) inUse(true);
};
return {
inUse: inUse,
endDate: endDate,
endDateClick: endDateClick
};
})();
ko.applyBindings(vm);
&#13;
/* Make visible when the control is disabled */
input[readonly] {
background-color: #EEE;
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<input id="inUse" type="checkbox" data-bind="checked: inUse"/>
<input id="endDate" data-bind="value: endDate, readonly: !inUse(), click: endDateClick"/>
&#13;