我想在我的ViewModel上使用一个属性来切换要显示的图标,而不创建反向的单独计算属性。这可能吗?
<tbody data-bind="foreach: periods">
<tr>
<td>
<i class="icon-search" data-bind="visible: !charted, click: $parent.pie_it"></i>
<i class="icon-remove" data-bind="visible: charted, click: $parent.pie_it"></i>
</td>
</tr>
</tbody>
我的ViewModel有一个属性句点,它是一个月份数组,如下所示:
var month = function() {
this.charted = ko.observable(false);
};
答案 0 :(得分:272)
在表达式中使用observable时,您需要以类似函数的方式访问它:
visible: !charted()
答案 1 :(得分:53)
我同意John Papa的观点,即应该有一个内置的hidden
绑定。专用hidden
绑定有两个好处:
hidden: charted
代替visible: !charted()
。charted
,而不是创建computed
来观察!charted()
。创建hidden
绑定很简单,但是这样:
ko.bindingHandlers.hidden = {
update: function(element, valueAccessor) {
ko.bindingHandlers.visible.update(element, function() {
return !ko.utils.unwrapObservable(valueAccessor());
});
}
};
您可以像内置的visible
绑定一样使用它:
<i class="icon-search" data-bind="hidden: charted, click: $parent.pie_it"></i>
<i class="icon-remove" data-bind="visible: charted, click: $parent.pie_it"></i>
答案 2 :(得分:9)
这有点令人困惑,因为你必须这样做
visible:!showMe()
所以,我做了
<span data-bind="visible:showMe">Show</span>
<span data-bind="visible:!showMe()">Hide</span>
<label><input type="checkbox" data-bind="checked:showMe"/>toggle</label>
我的模特是
var myModel={
showMe:ko.observable(true)
}
ko.applyBindings(myModel);
答案 3 :(得分:3)
您可以使用我的switch/case绑定,其中包括case.visible
和casenot.visible
。
<tbody data-bind="foreach: periods">
<tr>
<td data-bind="switch: true">
<i class="icon-search" data-bind="case.visible: $else, click: $parent.pie_it"></i>
<i class="icon-remove" data-bind="case.visible: charted, click: $parent.pie_it"></i>
</td>
</tr>
</tbody>
您也可以将其作为
<i class="icon-search" data-bind="casenot.visible: charted, click: $parent.pie_it"></i>
<i class="icon-remove" data-bind="case.visible: $else, click: $parent.pie_it"></i>
答案 4 :(得分:1)
为了让绑定知道对属性的更改,我复制了可见的绑定处理程序并将其反转:
ko.bindingHandlers.hidden = {
update: function (element, valueAccessor) {
var value = ko.utils.unwrapObservable(valueAccessor());
var isCurrentlyHidden = !(element.style.display == "");
if (value && !isCurrentlyHidden)
element.style.display = "none";
else if ((!value) && isCurrentlyHidden)
element.style.display = "";
}
};
答案 5 :(得分:0)
免责声明:此解决方案仅用于娱乐目的。
ko.extenders.not = function (target) {
target.not = ko.computed(function () {
return !target();
});
};
self.foo = ko.observable(true).extend({ not: null });
<div data-bind="text: foo"></div> <!-- true -->
<div data-bind="text: foo.not"></div> <!-- false -->
<!-- unfortunately I can't think of a way to be able to use:
text: foo...not
-->
答案 6 :(得分:0)
关于如何使用布尔可观察值的对立面,我遇到了同样的问题。我找到了一个简单的解决方案:
var ViewModel = function () {
var self = this;
// When program start, this is set to FALSE
self.isSearchContentValid = ko.observable(false);
self.gatherPlacesData = function () {
// When user click a button, the value become TRUE
self.isSearchContentValid(true);
};
现在在HTML上,您应该这样做
<p data-bind = "visible:isSearchContentValid() === false"> Text 1</p>
<p data-bind = "visible:isSearchContentValid"> Text 2</p>
程序启动时仅显示“ Text1”,因为“ false === false为TRUE”,而Text2不可见。
让我们说我们有一个按钮,该按钮在click事件上调用collectPlacesData。现在,Text1将不可见,因为“ true === false为FALSE”,而Text 2仅可见。
另一种可能的解决方案可能是使用可计算的可观察到的方法,但我认为这是一个过于复杂的解决方案,用于解决一个如此简单的问题。
答案 7 :(得分:-1)
也可以像这样使用隐藏:
<div data-bind="hidden: isString">
<input type="text" class="form-control" data-bind="value: settingValue" />
</div>