Knockout.js 对一个可观察的array进行排序会把";勾选“;结合

Knockout.js 对一个可观察的array进行排序会把";勾选“;结合,knockout.js,knockout-3.0,Knockout.js,Knockout 3.0,我有一个viewmodel,它有一个可观察的子viewmodels数组 这些应该是用户可排序的,所以我使用的是observearray的sort()方法: function ViewModel() { this.items = ko.observableArray([/* ... some items ... */]); this.sort = function () { this.items.sort(function (a, b) {

我有一个viewmodel,它有一个可观察的子viewmodels数组

这些应该是用户可排序的,所以我使用的是
observearray
sort()
方法:

function ViewModel() {
    this.items = ko.observableArray([/* ... some items ... */]);
    this.sort = function () {
        this.items.sort(function (a, b) {
            // comparison
        }
    }
}
每个项目都有一个可观察的
类型,通过选中的
绑定绑定到一个单选框列表

<li>
    <input type="radio" value="A" data-bind="checked: type" /> A
    <input type="radio" value="B" data-bind="checked: type" /> B
    <input type="radio" value="C" data-bind="checked: type" /> C
    <input type="radio" value="D" data-bind="checked: type" /> D
</li>
  • A. B C D
  • 这种现象是,当对
    数组进行排序时,无线框会随机失去其状态,即,对于看似随机的子集,屏幕上看不到任何点,即使它们的值仍保留在viewmodel中

    自己试试:-点击“排序”几次,观察效果

    简单的问题:这里出了什么问题,我该如何解决



    排序后对单个项目调用
    notifySubscribers()
    ,可以解决显示问题。然而,这是一种黑客行为,而不是解决方案。

    在JSFIDLE中,您设置了
    name
    属性,这就是导致这种错误行为的原因

    我不认为这是淘汰赛中的错误。只是排序时,单选项将由敲除处理程序和浏览器本身同时设置(因为单选组只能选中1个单选按钮)

    如果删除name属性(这是可以的,因为所有4个单选按钮都绑定到同一个字段,因此只会使用1个CKED CONSTRAINT),排序将按预期运行


    Demo

    一个有趣的观察结果-如果我使用的不是随机排序,而是
    返回b.I-a.I
    ,其中
    a
    b
    是排序功能的参数,0-9个收音机的选定值消失。也许这能带来什么?另外,我尝试了30个值,它隐藏了15个收音机。两次都是一半。至少看起来不再是随机的了如果你问我的话,这闻起来像是敲除中的一个真正的错误。给每个输入一个唯一的名称:
    name:'type_0'…name:'type_1'…
    每次都会导致一个随机项目丢失,就像@manji做的那样,设置
    id
    而不是
    name
    ,它确实起作用了:@Jeff。这也完美地解释了奇怪的“一半的物品受到影响”怪癖。好消息是,在knockout中,复选框组上有一个名称是不必要的,我只是出于习惯(或者OCD,如果你愿意的话)。我仍然认为这是一个bug,因为knockout的目的是控制浏览器的行为。浏览器如何初始化复选框组应该是完全无关的。也就是说,当您第一次初始化元素时(即创建
    ),它会按预期工作。排序父数组时,它会中断,甚至不会一致中断。拥有一个命名组是有效的HTML,并且应该不会影响knockout更新其绑定的方式,即使这不是严格必要的。但我可以确认,当我删除
    名称
    属性绑定时,我的应用程序中的事情开始起作用。问题是(我猜)将
    名称
    $index()
    混合在一起-一旦对数组排序,顺序就会改变,从而改变每个组中的名称,但是在这个过程中,一些电台已经有了这个名字,不同的组混合在一起,所以我想这不是一个bug,而是一个复杂的行为(我只是不知道knockout会如何预见到这样的事情…。@IlyaLuzyanin,你是对的,使用
    I
    (绑定视图模型的一个字段)而不是
    $index()
    解决了这个问题。@IlyaLuzyanin这就是解释。非常感谢。