javascript - Knockout.js - 可观察中的可观察

标签 javascript knockout.js

搜索了 stackoverflow 和其他来源 - 似乎找不到任何有帮助的内容。

我有一个类似统计表格的 UI,其中包含数据驱动的内容。数据是在后端序列化的巨大数组/对象。

然后,我提取该数组中的值 - 这些值被设置为可观察值 - 并使用数据绑定(bind)属性将它们输出到页面上。

该表格显示给定类别表现最佳的艺术家以及下面两位相关的艺术家。

问题是我们需要动态更改 data-bind 属性,以便它能够查看数据中的变量属性。

例如,如果用户按“艺术家”进行过滤,我们希望显示艺术家的姓名(即

<span data-bind="text: ArtistName()"></span>

但是

如果用户按“流派”进行过滤,我们希望 HTML 的同一部分能够显示轨道长度(或任何其他任意可观察属性)(即)

最终,我想要一个可变的数据绑定(bind)属性,例如

我知道我可以使用潜在的巨大 if 语句来实现这一点,如下所示:

<!-- ko if: $parent.SortMethod() == 'Topic1' -->
<span data-bind="text: Topic1()"></span>
<!-- /ko -->
<!-- ko if: $parent.SortMethod() == 'Topic2' -->
<span data-bind="text: Topic2()"></span>
<!-- /ko -->
<!-- ko if: $parent.SortMethod() == 'Topic3' -->
<span data-bind="text: Topic3()"></span>
<!-- /ko -->

...等等

肯定有更有效的方法......?

最佳答案

您必须将网格数据绑定(bind)到一个函数,然后该函数将返回按所需字段排序/过滤的数据。此外,您还必须将该下拉列表绑定(bind)到 View 模型中的可观察对象。

function GridModel(data)
{
      var self = this;
      self.RawData = data;
      self.SortedBy = ko.observable();

      self.GetGridData = function()
      {
           var ret = self.RawData();
           var sortingFld = self.SortedBy();

           if (sortingFld)
           {
               ret = ret.sort(function (a, b) {
                   a = ko.unwrap(a[sortingFld]);
                   b = ko.unwrap(b[sortingFld]);

                   return (a == b ? 0 : a < b ? -1 : 1) * 1;
                   });
           }

           return ret;
      }
}

HTML:

<table class="grid">
    <thead>
        <th>Category</th>
        <th>Artist</th>
        <th>Track</th>
    </thead>

    <tbody data-bind="foreach: GetGridData()">
        <td data-bind="text: Category"></td>
        <td data-bind="text: Artist"></td>
        <td data-bind="text: Track"></td>
    </tbody>
</table>

下拉列表将能够更改 SortedBy 可观察值并相应地自动刷新网格:

<select data-bind="value: SortedBy, options: ['Artist', 'Track']"></select>

(上面的代码仅演示了升序排序,但您也可以轻松扩展它以进行过滤)。

关于javascript - Knockout.js - 可观察中的可观察,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24047831/

相关文章:

javascript - knockout 数据绑定(bind)中的 TinyMCE 字数统计

knockout.js - 绑定(bind) observable 的 observableArray

javascript - Bootstrap 菜单换行符

javascript - 在 Node.js 中读取环境变量

javascript - 由于错误 editor-incorrect-element,CKEditor 4 无法正常工作

javascript - 如何使用ajax发送文件和文本

javascript - <select> 上的 applyBindings() 导致我的 subscribe() 触发,

javascript - knockout 映射——将多个数据源整合到一个 View 模型中

javascript - knockout 设置超时延迟

javascript - 限制半径内的对象数组并按距离排序