Knockoutjs(2.1.0 版):将布尔值绑定到选择框

Posted

技术标签:

【中文标题】Knockoutjs(2.1.0 版):将布尔值绑定到选择框【英文标题】:Knockoutjs (version 2.1.0): bind boolean value to select box 【发布时间】:2012-05-17 15:34:51 【问题描述】:

我想使用 KO v2.1.0 将布尔值绑定到选择元素,但显然它没有按预期工作。

html 代码:

<select data-bind="value: state">
    <option value="true">On</option>
    <option value="false">Off</option>
</select>

javascript 代码:

var model = 
    state: ko.observable(false)
;

ko.applyBindings(model)

所以我希望选择框进入“关闭”位置,初始值为false,但它处于“开启”状态。如果我输入状态:ko.observable("false") 它将是正确的,但这不是我想要的。有人知道如何将布尔值绑定到带有 KO 的选择框吗?

Jsfiddle:https://jsfiddle.net/greenlaw110/Ajm58/

【问题讨论】:

【参考方案1】:

这是我们从这个论坛post 探索的一个选项:

ko.bindingHandlers.booleanValue = 
    init: function(element, valueAccessor, allBindingsAccessor) 
        var observable = valueAccessor(),
            interceptor = ko.computed(
                read: function() 
                    return observable().toString();
                ,
                write: function(newValue) 
                    observable(newValue === "true");
                                   
            );
        
        ko.applyBindingsToNode(element,  value: interceptor );
    
;

因此,我们使用自定义绑定在 UI 和我们的视图模型之间注入一个可写的计算 observable。这只是直接在您的视图模型中执行此操作的替代方法。

示例:https://jsfiddle.net/rniemeyer/H4gpe/

【讨论】:

这对我来说是完美的解决方案!它改变了机制,而不是数据 这似乎是完美的解决方案。我唯一的问题是,这种方法有什么“隐藏的危险”吗?如果您有大量的 booleanValue 绑定,它是否可以很好地扩展?简而言之,您有什么理由想要使用这种方法? 我不觉得使用这种技术有任何隐藏的问题。它确实在实际模型值和绑定之间添加了一个额外的可写计算 observable,但这相当小,而且无论如何你都必须在视图模型方面做一些事情。 您会想提一下,小提琴需要 KO 2.3 才能显示 &lt;pre&gt; 数据。它是用 KO 3.0 保存的。【参考方案2】:

发生这种情况是因为 select 使用的是字符串,而不是任何阶段的布尔值。 您应该尝试使用 ko.computed( ... ) 值。

查看详情:https://jsfiddle.net/Ajm58/3/

<select id="testSelect" data-bind="value: stateString">
    <option value="true">true</option>
    <option value="false">false</option>
</select>
​

var model = 
    state: ko.observable(false)
;

model.stateString = ko.computed(
    read: function()  return (this.state() ? "true" : "false"); ,
    write: function(value)  this.state(value == "true"); 
, model);

ko.applyBindings(model);


setTimeout(function() 
    model.state(true);    
, 1500);

setTimeout(function() 
    $("#testSelect").val("false");
, 3000);

【讨论】:

【参考方案3】:

比其他答案容易得多:使用options-Binding。

答案在下面那种冗长的表达式中:

<select data-bind="options: [text: 'On', value: true, text: 'Off', value: false], value: lala1, optionsValue: 'value', optionsText: 'text'">

通过使用选项绑定,您几乎可以将所有内容分配给选项的值。我想,将显式值绑定到选项绑定是相当不常见的,但在这种 2-way 情况下,这是合理的。

【讨论】:

【参考方案4】:

我想我得到了答案,将数字“1”和“0”分别放在选项值中:

<select data-bind="value: state">
    <option value="1">On</option>
    <option value="0">Off</option>
</select>

见https://jsfiddle.net/greenlaw110/Ajm58/2/

【讨论】:

不绑定为布尔值,请参阅this fiddle。 state 实际上在这里等于 '0' 或 '1',而不是 true 或 false。

以上是关于Knockoutjs(2.1.0 版):将布尔值绑定到选择框的主要内容,如果未能解决你的问题,请参考以下文章

将 jquery ui 对话框与 knockoutjs 集成

如何使用 KnockoutJS 和 JQuery UI 创建自动完成组合框

KnockoutJS:将 Observable 属性和函数添加到映射生成的 ObservableArray 中的对象

如何将focusOut事件绑定到knockoutjs

有没有办法使用 KnockoutJS 将 XML 文件转换为 CSV?

knockoutjs 验证,立即验证