在我的视图模型中,我有一个布尔属性,它由视图中的复选框可视化。我希望用户也能够单击包含元素来切换属性,但当用户单击复选框时会出现问题:此时未注册更改。
考虑以下观点:
<div class="my-option" data-bind="click: toggleOption1">
<input type="checkbox" data-bind="checked: isOption1Checked" />
Entire div is clickable to select this option.
</div>
使用此视图模型:
var ViewModel = function() {
var self = this;
self.isOption1Checked = ko.observable(false);
self.toggleOption1 = function(){
self.isOption1Checked(!self.isOption1Checked());
};
};
如您所见
this corresponding jsfiddle
,这将
不
允许您单击复选框以更改布尔可观察值。这对我来说很有意义,可能单击处理程序会更改值,但选中的绑定也会处理更改并还原它。
我觉得我需要的一般解决方案是
单向检查绑定
或者类似的东西,所以我尝试使用
attr
结合:
<div class="my-option" data-bind="click: toggleOption1">
<input type="checkbox"
data-bind="attr: { checked: isOption1Checked() ? 'checked' : '???'" />
Entire div is clickable to select this option.
</div>
然而,这行不通:没有
checked="false"
选项。您只需省略
checked
属性。我不认为
属性
然而,绑定可以做到这一点。
我想到的另一个解决方法是创建自己的绑定(可能基于/将读取位委派为默认值
选中的
绑定),但这感觉太过分了。我是否错过了一个显而易见的、优雅的淘汰解决方案?
我当前的解决方法(试图避免创建这样的自定义绑定)涉及一些复杂的视图逻辑:
<div class="my-option" data-bind="click: toggleOption1">
<!-- ko if: isOption1Checked -->
<input type="checkbox" checked="checked" />
<!-- /ko -->
<!-- ko if: !isOption1Checked() -->
<input type="checkbox" />
<!-- /ko -->
Entire div is clickable to select this option.
</div>
This works
,但对我来说非常冗长。
还有其他优雅、简洁的方式来处理这个问题吗?