【问题标题】:KnockoutJS "checked" binding doesn't work with observableArray and radio button listsKnockoutJS“已检查”绑定不适用于 observableArray 和单选按钮列表
【发布时间】:2012-02-22 16:57:23
【问题描述】:

我有一个名为 SelectedAttributeValueIds 的 observableArray,我需要使用“已检查”绑定将其绑定到单选按钮列表。例如

<input type="radio" data-bind="checked: SelectedAttributeValueIds" />

然而,KnockoutJS 将 observableArray 替换为一个可观察的值。因此,而不是具有 [123] 值的 SelectedAttributeValueIds 将是“123”

我这样做是为了解决问题,但想知道是否有更简单的方法:

<input type="radio" data-bind="event: { change: function() { $parent.SelectedAttributeValueIds([$data.ID()]); } }" />

【问题讨论】:

    标签: javascript html knockout.js


    【解决方案1】:

    对于单选按钮,KO 假设只有一个“值”可以写入。对于复选框,它将在数组中添加/删除值。

    听起来你总是想写一个单一的值,但让它作为唯一的元素放在一个数组中。

    一种选择是创建一个ko.computed 来表示数组中的项目。另一种选择是使用可写的ko.computed 绑定输入并让它在您想要的格式之间代理值。比如:

    this.SelectedAttributeValueIds = ko.observableArray();
    this.SelectedAttributeValueId = ko.computed({
       read: function() {
           var values = this.SelectedAttributeValueIds();
           return values.length ? values[0] : [];
       },
       write: function(newValue) {
           this.SelectedAttributeValueIds([newValue]);
       },
       owner: this
    });
    

    【讨论】:

    • 我试过了,但是当我需要它作为存储在 HTML 元素的 value="" 属性中的值时,它会为 newValue 传递“true”或“false”
    • 这是一个你可以尝试复制的小提琴:jsfiddle.net/rniemeyer/LWeQ8
    • 好的,我明天上班时试一试。我希望有一种不同的方式来做到这一点,而不是这种方式..但我猜不是:(
    • 这行得通,谢谢,虽然我不得不改变这个:阅读:function() { var values = ko.utils.unwrapObservable(this.SelectedAttributeValueIds);返回值。长度?值[0]:空; },
    • 是的,observableArray 应该已经解包了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多