是否可以将数据绑定显示为布尔ViewModel属性的否定("!")?

agr*_*adl 158 knockout.js

我想在我的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>
Run Code Online (Sandbox Code Playgroud)

我的ViewModel有一个属性句点,它是一个月份数组,如下所示:

var month = function() {
    this.charted = ko.observable(false);
};
Run Code Online (Sandbox Code Playgroud)

RP *_*yer 273

在表达式中使用observable时,您需要将其作为以下函数访问:

visible: !charted()

  • 也许我们应该制作一个隐藏的绑定:)我们有启用和禁用. (33认同)
  • 当使用!charted时,你得到了![功能].[功能]是真的,![功能]变为假,如果你使用那个语法,它将永远是假的.http://jsfiddle.net/datashaman/E58u2/3/ (2认同)
  • 我希望在文档中更清楚. (2认同)

Dav*_*ave 53

我同意约翰帕帕的评论,即应该有一个内置的hidden绑定.专用hidden绑定有两个好处:

  1. 更简单的语法,即.hidden: charted而不是visible: !charted().
  2. 资源较少,因为Knockout可以charted直接观察到observable ,而不是创建一个computed观察!charted().

hidden尽管如此,创建绑定很简单,如下所示:

ko.bindingHandlers.hidden = {
  update: function(element, valueAccessor) {
    ko.bindingHandlers.visible.update(element, function() {
      return !ko.utils.unwrapObservable(valueAccessor());
    });
  }
};
Run Code Online (Sandbox Code Playgroud)

您可以像内置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>
Run Code Online (Sandbox Code Playgroud)

  • 如果没有返回`return!ko.utils.unwrapObservable(valueAccessor());这对我没有用. (9认同)

Jha*_*bub 9

你必须这样做,这有点令人困惑

visible:!showMe()
Run Code Online (Sandbox Code Playgroud)

所以我做了

<span data-bind="visible:showMe">Show</span>
<span data-bind="visible:!showMe()">Hide</span>
<label><input type="checkbox" data-bind="checked:showMe"/>toggle</label>?
Run Code Online (Sandbox Code Playgroud)

我的模特是

var myModel={
    showMe:ko.observable(true)
}
ko.applyBindings(myModel);    
Run Code Online (Sandbox Code Playgroud)

检查小提琴http://jsfiddle.net/khanSharp/bgdbm/