Knockout js foreach 按字母顺序绑定

Posted

技术标签:

【中文标题】Knockout js foreach 按字母顺序绑定【英文标题】:Knockout js foreach binding alphabetically 【发布时间】:2021-12-08 22:33:48 【问题描述】:

我是淘汰赛的新手。

很好,您帮助我了解我需要如何更改此代码:

<ol class="items" data-bind="foreach: getDisplayedItems()">
    <li class="item">
        <a class="simple" data-bind="html: label, attr: href:url, visible: count >= 1, css:  active: is_selected "></a>
        <span class="count" data-bind="text: count"></span>
    </li>
</ol>

按字母顺序制作?

感谢您的任何提示 问候

【问题讨论】:

【参考方案1】:

您可以就地对它们进行排序:

<ol class="items" data-bind="foreach: getDisplayedItems().sort((a, b) => ko.unwrap(a.label) < ko.unwrap(b.label) ? -1 : 1)">
    <li class="item">
        <a class="simple" data-bind="html: label, attr: href:url, visible: count >= 1, css:  active: is_selected "></a>
        <span class="count" data-bind="text: count"></span>
    </li>
</ol>

但我认为这很丑陋,而且不可重复使用。最好创建一个新的 observable 数组,其中包含按正确顺序排列的项目:

function App 
    // the observable you already have
    this.getDisplayedItems = ko.observableArray([...]);

    // a computed observable based on that
    this.getDisplayedItemsAlphabetical = ko.pureComputed(() => this.getDisplayedItems.sorted((a, b) => ko.unwrap(a.label) < ko.unwrap(b.label) ? -1 : 1));

<ol class="items" data-bind="foreach: getDisplayedItemsAlphabetical">

【讨论】:

小记:您的getDisplayedItemsAlphabetical 纯计算有一个副作用,即在getDisplayedItems 中对数组进行排序(即使它不会在那里触发值突变)。 @user3297291 这是一个非常好的观点,我没有想到这一点。固定! 谢谢大家!它就像一个魅力! ;) @Dnc44 getDisplayedItems 是您的视图模型中的常规函数​​还是可观察的? @Tomalak 是一个函数

以上是关于Knockout js foreach 按字母顺序绑定的主要内容,如果未能解决你的问题,请参考以下文章

Knockout.js - 如何使用“foreach”以两种不同的方式显示项目列表?

Knockout JS foreach 作为函数的输入

knockout.js 数据中的嵌套 foreach 显示但未正确显示

为啥它以随机顺序初始化这个 Knockout.js 组件?

仅显示基于 Knockout.js 标记中的属性的不同值

在 Knockout.js 中单击按钮时检查选择控件是不是具有值