Knockout + Radiobuttons - 在取消选中时将值切换回“false”

Posted

技术标签:

【中文标题】Knockout + Radiobuttons - 在取消选中时将值切换回“false”【英文标题】:Knockout + Radiobuttons - getting the value to toggle back to 'false' on uncheck 【发布时间】:2014-04-15 18:51:32 【问题描述】:

我有一个 Knockout 应用程序,其中我有多个布尔属性,只有 1 个可以是 true。 (而不是 1 个基础属性,每个单选按钮都是不同的值)。

当我选择一个单选按钮时,observable 将正确更新为单选按钮的checkedValue。当我取消选择它时,该值仍然存在。有什么办法可以将 observable 设置为false

我的 JS 小提琴示例:http://jsfiddle.net/9mu8e/

我对设置中间值和 .subscribe() 对所有值进行排序有点谨慎。 (而分散的布尔值是我们发送到的 REST 接口的一个特性)。

更新:我添加了“添加新”按钮以将列表显示为动态的,并且可能包含重复值(因此跟踪文本属性或理论上的 DB ID 不是)不可能)。 jsFiddle 链接已更新。

我的例子:

查看:

<div>Current item: 
    <input type="radio" name="group" data-bind="checked: isMostTerrible, checkedValue: true" />
    <span data-bind="text: isMostTerrible"></span>
</div>

<ul data-bind="foreach: itemsList">
    <li>
        <span data-bind="text: name"></span>
        <input type="radio" name="group" data-bind="checked: isMostTerrible, checkedValue: true" />
        <span data-bind="text: isMostTerrible"></span>
    </li>
</ul>

<button data-bind="click: onAddNewItem">Add new</button>

查看模型:

var item = function(name, dbId) 


var self = this;

    self.dbId = ko.observable(dbId);
    self.name = ko.observable(name);
    self.isMostTerrible = ko.observable(false);


var itemList = [
    new item("Taxes", 1),
    new item("Death", 2)
]

var viewModel = function() 
  var self = this;

    self.isMostTerrible = ko.observable(true);
    self.itemsList = ko.observableArray(itemList);

    self.onAddNewItem = function() 
        // Note - Adding a new item doesn't add a DB ID.
        // (Theoretically occurs on save)
        self.itemsList.push(new item("New item"));
    
;

ko.applyBindings(viewModel);

【问题讨论】:

【参考方案1】:

一个问题是 Knockout 的 checked 绑定根本无法按照您尝试使用它的方式工作。它的目的是使用绑定到组中所有单选按钮的单个 observable 进行设置,每个按钮都有一个唯一的值。

另一个问题是当取消选择单选按钮时浏览器不提供通知。 (见OnChange event handler for radio button (INPUT type="radio") doesn't work as one value)。因此,侦听change 事件的简单绑定将不起作用。

不过,使用自定义绑定可以实现您想要的。我在下面包含的那个使用 observable 来跟踪当前选择的单选按钮,以便它可以相应地更新模型值。

ko.bindingHandlers.radioChecked = (function() 
    var groupObservables = ;
    return 
        init: function(element, valueAccessor) 
            var name = element.name,
                groupObservable = groupObservables[name] || (groupObservables[name] = ko.observable());

            ko.utils.registerEventHandler(element, 'click', function() 
                valueAccessor()(element.checked);
            );
            var s1 = ko.computed(function() 
                if (valueAccessor()()) 
                    element.checked = true;
                    groupObservable(element);
                
            );
            var s2 = groupObservable.subscribe(function() 
                valueAccessor()(element.checked);
            );
            ko.utils.domNodeDisposal.addDisposeCallback(element, function() 
                s1.dispose();
                s2.dispose();
            );
        
    ;
)();

小提琴:http://jsfiddle.net/mbest/3dy3s/

【讨论】:

【参考方案2】:

视图模型:-

var item = function (name) 
  var self = this;
  self.name = ko.observable(name);

var itemList = [
    new item("Taxes"),
    new item("Death")]

var viewModel = function () 
  var self = this;
  self.isMostTerrible = ko.observable(true);
  self.Checked = ko.observable();
  self.itemsList = itemList;
;
ko.applyBindings(viewModel);

查看

<div>Current item:
  <input type="radio" name="group" data-bind="checked: isMostTerrible" /> <span data-bind="text: isMostTerrible()==='on'"></span>
</div>
<ul data-bind="foreach: itemsList">
  <li> <span data-bind="text: name"></span>
     <input type="radio" name="group" data-bind="checked: isMostTerrible,value:name" /> <span data-bind="text: isMostTerrible()==name()"></span>
 </li>
</ul>

Fiddle Demo

【讨论】:

谢谢,非常接近。在我的特殊情况下,我没有可靠的标识符(您使用其他正确的 isMostTerrible()==name())。我的列表可能包含新的动态值,其中可能包含重复项 - 并且新条目不会有数据库 ID。问题 + jsFiddle 已更新。

以上是关于Knockout + Radiobuttons - 在取消选中时将值切换回“false”的主要内容,如果未能解决你的问题,请参考以下文章

RadioGroup 有两列有十个 RadioButtons

获取 Android 中 RadioGroup 中的 RadioButtons 数组

JavaFX:禁用键盘控制RadioButtons

java 将radiobuttons绑定到Map

html radiobuttons风格

html radiobuttons风格