javascript - 挖空选择和文本框共享绑定(bind)

标签 javascript data-binding knockout.js

我有一个页面,其中有一个选择框和一个输入框被绑定(bind)到相同的值。这个想法是,通常人们会从选择中选择一个值,但是,用户也应该能够在输入框中输入任意字符串。问题是,如果我输入的内容不存在于选择中,由于绑定(bind),该值将设置为选择中的第一项。

这是我想要实现的行为:

用户从 select 中选择值

  1. 已将值设置为所选项目。
  2. 输入已更新为所选值。

用户在input中输入文本

  1. 值设置为输入的文本。
  2. 选择不会更改除非值存在于可用值的集合中。

换句话说,我想要的是最后更改的控件是有效值。但我也希望这两个控件都是最新的只要给定值对该控件有效

我的代码是这样的:

js

var viewModel = { Value: ko.observable('1'), Set: ['1', '2', '3'] };
ko.applyBindings(viewModel);

html

<!-- ko if: Set.length > 1 || (Set.length > 0 && Set[0] != '') -->
<select type="text" class="form-control input-small" data-bind="options: Set, value: Value">
</select>
<!-- /ko -->

<input class="form-control input-small" data-bind="value: Value" style="margin-top: 5px;" />

这里是一个 jsfiddle 显示代码当前如何工作:http://jsfiddle.net/b2RwG/

[编辑]
我找到了一个可行的解决方案 ( http://jsfiddle.net/b2RwG/2/ ),但它确实不太好,必须有更好的方法来解决这个问题。

最佳答案

如您所见,我添加了一个绑定(bind)到文本输入的 inputValue 可观察对象。 我还添加了一个计算命名的 virtualSet,其中包含原始项目和新项目(来自文本输入)。 我订阅了 inputValue,以便在您输入时自动设置选择。

var viewModel = {    
    inputValue: ko.observable('1'),
    Value: ko.observable('1'),
    Set: ['1', '2', '3']    
};
viewModel.virtualSet = ko.computed({
    read: function () {
        var vs = this.Set.slice(0);
        if (this.inputValue() && this.inputValue().length)
             vs.unshift(this.inputValue());
        return vs;
    },
    owner: viewModel
});
viewModel.inputValue.subscribe(function (value) {
    viewModel.Value(value);
});

See fiddle

希望对你有帮助。

关于javascript - 挖空选择和文本框共享绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17964450/

相关文章:

javascript - Firebase 在 dataSnapshot 中获取引用 URL 的完整路径(javascript API)

JavaScript,获取与 'id'等属性值相同的元素

javascript - knockout foreach 子数组未显示

c# - Winforms ComboBox DataBinding DisplayMember 到 SubObject 属性

c# - 绑定(bind)到 IList,但得到 "Complex DataBinding accepts as a data source either an IList or an IListSource"

javascript - 对 kendo-ui 输入 wrraper 的宽度使用 knockout

javascript - knockout : implementing "focusing" on object from list

javascript - 如何在 React 上获取 html 标签的值?

javascript - promise 的嵌套 while 循环

javascript - MVC5 CRUD 最佳方法