如何使用敲除 disable/enable html table 中的所有元素
how to disable/enable all elements in an html table using knockout
我有一个 table,每行有 2 个输入,全部绑定到 self.editing = ko.computed(…)
,即,对于 table 中的每个元素,我必须
<input type="number" data-bind="textInput:myObservObj, enable: editing" />
我怎样才能避免这种情况并在这种情况下编辑和enable/disable table中的所有输入可以接受可观察对象的其他东西?
这是我的完整 html 代码(如您所见,我必须在所有地方重复 enable: $parent.editing
):
<table>
<thead>
<tr>
<td style="width:115px"></td>
<td style="margin-right: 10px">Left</td>
<td>Right</td>
</tr>
</thead>
<tbody>
<tr>
<td><label>Type (Jerger)</label></td>
<td>
<span data-bind="with:leftEarTympanometry">
<select data-bind="options: availableTypes,
value: type,
optionsCaption: 'Choose...', enable: $parent.editing, style: { borderColor: 'black' }"></select>
</span>
</td>
<td>
<span data-bind="with:rightEarTympanometry">
<select data-bind="options: availableTypes,
value: type,
optionsCaption: 'Choose...', enable: $parent.editing, style: { borderColor: 'black' }"></select>
</span>
</td>
</tr>
<tr>
<td><label>Pressure (daPa)</label></td>
<td>
<span data-bind="with:leftEarTympanometry">
<input type="number" data-bind="textInput:pressure, enable: $parent.editing, style: { borderColor: pressureInvalid() ? 'red' : 'black' }"/>
</span>
</td>
<td>
<span data-bind="with:rightEarTympanometry">
<input type="number" data-bind="textInput:pressure, enable: $parent.editing, style: { borderColor: pressureInvalid()? 'red' : 'black' }"/>
</span>
</td>
</tr>
<tr>
<td><label>Peak (mmho)</label></td>
<td>
<span data-bind="with:leftEarTympanometry">
<input type="number" data-bind="textInput:peak, enable: $parent.editing, style: { borderColor: peakInvalid()? 'red' : 'black' }"/>
</span>
</td>
<td>
<span data-bind="with:rightEarTympanometry">
<input type="number" data-bind="textInput:peak, enable: $parent.editing, style: { borderColor: peakInvalid()? 'red' : 'black' }" />
</span>
</td>
</tr>
<tr>
<td><label>Volume (cc)</label></td>
<td>
<span data-bind="with:leftEarTympanometry">
<input type="number" data-bind="textInput:volume, enable: $parent.editing, style: { borderColor: volumeInvalid()? 'red' : 'black' }"/>
</span>
</td>
<td>
<span data-bind="with:rightEarTympanometry">
<input type="number" data-bind="textInput:volume, enable: $parent.editing, style: { borderColor: volumeInvalid()? 'red' : 'black' }"/>
</span>
</td>
</tr>
</tbody>
</table>
您可以创建自定义绑定,如下所示:
ko.bindingHandlers.enableAll = {
update: function(elem, valueAccessor) {
var enabled = ko.utils.unwrapObservable(valueAccessor());
ko.utils.arrayForEach(elem.getElementsByTagName('input'), function(i) {
i.disabled = !enabled;
});
ko.utils.arrayForEach(elem.getElementsByTagName('select'), function(i) {
i.disabled = !enabled;
});
ko.utils.arrayForEach(elem.getElementsByTagName('checkbox'), function(i) {
i.disabled = !enabled;
});
ko.utils.arrayForEach(elem.getElementsByTagName('textarea'), function(i) {
i.disabled = !enabled;
});
}
};
然后在您的表单上,根据您是要禁用所有控件还是启用所有控件,将 enableAll 绑定到 true 或 false,例如:
<form data-bind="enableAll: somecondition()">
...
</form>
我有一个 table,每行有 2 个输入,全部绑定到 self.editing = ko.computed(…)
,即,对于 table 中的每个元素,我必须
<input type="number" data-bind="textInput:myObservObj, enable: editing" />
我怎样才能避免这种情况并在这种情况下编辑和enable/disable table中的所有输入可以接受可观察对象的其他东西?
这是我的完整 html 代码(如您所见,我必须在所有地方重复 enable: $parent.editing
):
<table>
<thead>
<tr>
<td style="width:115px"></td>
<td style="margin-right: 10px">Left</td>
<td>Right</td>
</tr>
</thead>
<tbody>
<tr>
<td><label>Type (Jerger)</label></td>
<td>
<span data-bind="with:leftEarTympanometry">
<select data-bind="options: availableTypes,
value: type,
optionsCaption: 'Choose...', enable: $parent.editing, style: { borderColor: 'black' }"></select>
</span>
</td>
<td>
<span data-bind="with:rightEarTympanometry">
<select data-bind="options: availableTypes,
value: type,
optionsCaption: 'Choose...', enable: $parent.editing, style: { borderColor: 'black' }"></select>
</span>
</td>
</tr>
<tr>
<td><label>Pressure (daPa)</label></td>
<td>
<span data-bind="with:leftEarTympanometry">
<input type="number" data-bind="textInput:pressure, enable: $parent.editing, style: { borderColor: pressureInvalid() ? 'red' : 'black' }"/>
</span>
</td>
<td>
<span data-bind="with:rightEarTympanometry">
<input type="number" data-bind="textInput:pressure, enable: $parent.editing, style: { borderColor: pressureInvalid()? 'red' : 'black' }"/>
</span>
</td>
</tr>
<tr>
<td><label>Peak (mmho)</label></td>
<td>
<span data-bind="with:leftEarTympanometry">
<input type="number" data-bind="textInput:peak, enable: $parent.editing, style: { borderColor: peakInvalid()? 'red' : 'black' }"/>
</span>
</td>
<td>
<span data-bind="with:rightEarTympanometry">
<input type="number" data-bind="textInput:peak, enable: $parent.editing, style: { borderColor: peakInvalid()? 'red' : 'black' }" />
</span>
</td>
</tr>
<tr>
<td><label>Volume (cc)</label></td>
<td>
<span data-bind="with:leftEarTympanometry">
<input type="number" data-bind="textInput:volume, enable: $parent.editing, style: { borderColor: volumeInvalid()? 'red' : 'black' }"/>
</span>
</td>
<td>
<span data-bind="with:rightEarTympanometry">
<input type="number" data-bind="textInput:volume, enable: $parent.editing, style: { borderColor: volumeInvalid()? 'red' : 'black' }"/>
</span>
</td>
</tr>
</tbody>
</table>
您可以创建自定义绑定,如下所示:
ko.bindingHandlers.enableAll = {
update: function(elem, valueAccessor) {
var enabled = ko.utils.unwrapObservable(valueAccessor());
ko.utils.arrayForEach(elem.getElementsByTagName('input'), function(i) {
i.disabled = !enabled;
});
ko.utils.arrayForEach(elem.getElementsByTagName('select'), function(i) {
i.disabled = !enabled;
});
ko.utils.arrayForEach(elem.getElementsByTagName('checkbox'), function(i) {
i.disabled = !enabled;
});
ko.utils.arrayForEach(elem.getElementsByTagName('textarea'), function(i) {
i.disabled = !enabled;
});
}
};
然后在您的表单上,根据您是要禁用所有控件还是启用所有控件,将 enableAll 绑定到 true 或 false,例如:
<form data-bind="enableAll: somecondition()">
...
</form>