javascript - 如何创建共享单个列表的链接下拉列表并确保只能在一个下拉列表中选择每个值?

标签 javascript knockout.js

我正在尝试使用 knockout 创建一组下拉菜单,允许用户从列表中选择最多 3 个值,例如颜色。列表开头为:- 红、橙、黄、绿、蓝、靛、紫

DropDown 1 - Select any of the 7
DropDown 2 - Select any of the 6 remaining
Dropdown 3 - Select any of the 5 remaining

如果用户返回并将 DropDown 1 更改为某种颜色,他们应该只能选择其他剩余颜色(以及 Drop Down 1 中的颜色)。如果他们随后更改它,我将能够转到下拉列表 2 或 3,并将其更改为以前在 1 中的值。

我想我需要一个包含 7 个项目的初始数组,然后每个下拉列表都需要一个可观察的。这 3 个可观测值必须基于初始数据,并排除其他三个下拉列表中的选定数据。我真的很挣扎。我什至无法实现它。

这是否可能或者是否适合 Knockout 或者我应该只用 onChange 来查看 JS

最佳答案

这在 knockout 中绝对是可能的。大概有 10 种方法可以做到这一点。我在这里想出了一种方法:

http://jsfiddle.net/mbest/wfW97/

引用代码如下:

function ViewModel() {
    var self = this;
    self.colors = ['red','orange','yellow','green','blue','indigo','violet'];
    self.selections = [];
    ko.utils.arrayForEach(self.colors, function() {
        self.selections.push(ko.observable());
    });
    self.selfAndUnselectedColors = function(index) {
        var selfColor = self.selections[index]();
        return ko.utils.arrayFilter(self.colors, function(color) {
            return color === selfColor || !ko.utils.arrayFirst(self.selections, function(sel) {
                return color === sel();
            });
        });
    }
}
ko.applyBindings(new ViewModel());

和 HTML:

<div data-bind="repeat: colors.length">
    <select data-bind="options: selfAndUnselectedColors($index), optionsCaption: 'select a color', value: selections[$index]"></select>
</div>​

我正在使用我的 repeat绑定(bind)插件来创建重复的选择元素,但如果您愿意,您可以使用其他方法。

关于javascript - 如何创建共享单个列表的链接下拉列表并确保只能在一个下拉列表中选择每个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11092291/

相关文章:

javascript - Iron Router,尝试创建一个联系人应用程序,为每个联系人提供单独的页面

javascript - 如何通过一次按键触发 fadeToggle() 来触发多个 DOM 元素

javascript - 如何用找到的正则表达式替换匹配项(不区分大小写),但扩展结果

model-view-controller - knockoutjs 的无容器语句在 hottowel SPA 中不起作用?

javascript - knockout.js 阻止第一个值更改

javascript - 在 knockout.js 中为 applyBindings 实例化 View 模型时绑定(bind)中断

javascript - HTML 5 Canvas - 在 Canvas 中动态包含多个图像

javascript - 通过参数传递图像,JQuery Mobile

javascript - ASP.net MVC/Knockout JS 映射 - 无法更新 ViewModel

javascript - 创建使用 Underscore.js groupBy 和 map 计算的 knockout 以进行选择控制