【问题标题】:Perform a not true checked binding on knockout js?对淘汰赛js执行不真实的检查绑定?
【发布时间】:2013-04-27 21:48:16
【问题描述】:
我在敲除JS中有一个输入类型复选框,并且在选中此复选框时,我会抱怨执行“不正确”操作。像这样的:
<input type="checkbox" data-bind="checked: !IsVisible"/>
但这不起作用。
我知道我可以调用 IsHidden 并设置常见的检查绑定,但是我在女巫中有一个特殊情况我需要这种行为。
【问题讨论】:
标签:
javascript
jquery
knockout.js
checked
【解决方案1】:
定义自定义绑定。请参阅“Simplifying and cleaning up views in KnockoutJS”,其中有一个部分与您所要求的非常非常相似。基本上,这样的事情应该可以工作(注意:未经测试):
ko.bindingHandlers.notChecked = {
update: function(element, valueAccessor) {
var value = ko.utils.unwrapObservable(valueAccessor());
ko.bindingHandlers.checked.update(element, function() { return!value; });
}
};
那么你可以这样做:
data-bind="notChecked: IsVisible"
【解决方案2】:
您可以直接在绑定中评估 observable,您的想法应该可行。
像这样:<input type="checkbox" data-bind="checked: !IsVisible()"/>
但是请注意,这会失去“可观察性”,这可能不是您想要的。
另一种方法是创建一个根据 IsVisible 计算的 IsHidden 属性。
var ViewModel = function (model) {
var self = this;
self.IsVisible = ko.observable(model.IsVisible);
self.IsHidden = ko.computed({
read: function () {
return !self.IsVisible();
},
write: function (newValue) {
self.IsVisible(!newValue);
}
});
}
See the Fiddle
【解决方案3】:
这是因为 !你正在对 observable 执行一个函数。使用这个:
<input type="checkbox" data-bind="checked: !IsVisible()"/>