knockoutJs ko 如果在 foreach 内

knockoutJs ko if inside foreach

我有这样的东西

查看:

 <ul data-bind="foreach: colaboradores">
    <li>
      <span data-bind="text: nome"></span>
      <button
        class="btn btn-success"
        data-bind="click: $parent.show.bind($parent, $index)"
      >
      
        + Informações
      </button>
    </li>
    <!-- ko if: $parent.isDisplay -->
    <li data-bind="text: idade"></li>
    <li data-bind="text: city"></li>
    <!-- /ko -->
  </ul>

视图模型


return {
    isDisplay: ko.observable(false),

    colaboradores: ko.observableArray([
      {
        nome: 'Daniel',
        idade: 29,
        city: 'Floripa'
      },
      {
        nome: 'Iago',
        idade: 22,
        city: 'Floripa'
      },
      {
        nome: 'Rafael',
        idade: 26,
        city: 'Jaguaruna'
      }
    ]),
 
show: function ($index) {
      if (!this.isDisplay()) {
        this.isDisplay(true)
      } else if (this.isDisplay()) {
        this.isDisplay(false)
      }

      console.log(this.isDisplay())
      console.log($index)
    }

一旦我单击按钮,它就会呈现所有内容,而我只想呈现来自 foreach 中相同索引的内容。 所有三个按钮都有效,但不只是显示每个 'colaboradores' 的内容,而是显示所有 3

的所有内容

那是因为你只有一个 isDisplay 变量。

一种可能的解决方案是使用数组来跟踪您要显示的项目。

return {
    displayItems: ko.observableArray(),

    colaboradores: ko.observableArray([
      {
        nome: 'Daniel',
        idade: 29,
        city: 'Floripa'
      },
      {
        nome: 'Iago',
        idade: 22,
        city: 'Floripa'
      },
      {
        nome: 'Rafael',
        idade: 26,
        city: 'Jaguaruna'
      }
    ]),
 
    toggleItem: function ($index) {
        var index = this.displayItems.indexOf($index);
        if (index > -1) {
            this.displayItems.splice(index, 1);
        } else {
            this.displayItems.push($index);
        }
    }
}

你的 HTML 看起来像这样:

 <ul data-bind="foreach: colaboradores">
    <li>
      <span data-bind="text: nome"></span>
      <button
        class="btn btn-success"
        data-bind="click: $parent.toggleItem.bind($parent, $index)"
      >
      
        + Informações
      </button>
    </li>
    <!-- ko if: $parent.displayItems.indexOf($index) > -1 -->
    <li data-bind="text: idade"></li>
    <li data-bind="text: city"></li>
    <!-- /ko -->
  </ul>