【问题标题】:Knockout.js and twoway binding of checkboxesKnockout.js 和复选框的双向绑定
【发布时间】:2012-06-13 18:05:07
【问题描述】:

首先:我是 knout js 的新手,并试图围绕 knockout/mvvm 的思维方式进行思考,所以如果我的问题被证明是微不足道的,请原谅我。

我有以下情况:我有一个淘汰视图模型,其中包含一个 observableArray 所选票证对象。该数组表示更大票证集合的用户定义选择/子集。整套票都列在一个 jqgrid 表中,每一行都有一个复选框,应该告诉每个票是否被选中。这意味着只要“selectedTickets”数组发生变化,就需要更新复选框的值。除此之外,我还希望用户能够单击每个复选框,以便从选择中添加/删除票证。这似乎是一个相当可接受的功能,对吧?

但是,我确实无法看到如何使用淘汰赛“检查”绑定来实现这一目标。我的第一个想法是在名为“isSelected”的视图模型对象上使用计算/依赖的 observable,它会反映 selectedTickets 数组中的变化,并根据票证是否在 selectedTickets 数组中返回 true 或 false。这里的第一个问题是,我需要将一个参数传递给计算的 observable,说明它应该查找哪个票证 ID,并且据我所知,它只适用于可写的计算 observable。然而,获取复选框的状态似乎不像是一个写操作,所以已经开始闻起来了。下一个问题是绑定需要是双向的,因为我希望用户能够更改每个复选框的状态并相应地更新 selectedTickets 数组。这是一个不同的操作,因为它实际上会删除/添加票到 selectedTickets 数组。这将再次触发计算的 observable 尝试设置复选框的状态。如果我尝试这样做,似乎这两个用例最终可能会像无限循环一样结束。我还没有找到一种结合这两个用例的好方法,只使用复选框的选中绑定。

我当然可以手动对复选框进行事件处理,方法是将侦听器连接到复选框上的更改事件和剔除视图模型中的 selectedTickets 数组,但我希望通过剔除绑定可以更加自动化.

希望有一些淘汰赛高手可以指导我走上一条好的道路,因为我觉得我已经偏离了这个轨道。

【问题讨论】:

  • 人们不喜欢文字墙,也许你可以更明确地描述你的问题?
  • 我认为你的意思是简洁。他已经很明确了! :)

标签: javascript knockout.js


【解决方案1】:

在使用knockout.js时,你需要停止做事半途而废——如果你有一个item列表,数据属于viewmodel(不仅仅是select items),只有外观是由view定义的。

因此,我建议使用 Item 类型的 observable 数组 items,它具有属性 isSelected - 然后可以通过计算的 observable 访问所选项目:

var Item = function(name) {
    this.name = ko.observable(name);
    this.isSelected = ko.observable(false);
};

var ViewModel = function() {
    var self = this;

    self.items = ko.observableArray([
        new Item('Foo'), new Item('Bar'), new Item('Foo Bar')
    ]);

    self.selectedItems = ko.computed(function() {
        return ko.utils.arrayFilter(self.items(), function(item) {
            return item.isSelected();
        });
    });
};

http://jsfiddle.net/htZfX/

【讨论】:

  • 我认为您对此的看法是正确的。我有一种感觉,我设置视图模型的方式存在重大缺陷,我认为你已经做到了!我最终在视图模型中只有选定的票证的原因是因为我没有从这个应用程序的开始使用淘汰赛。我一直在想我想测试淘汰赛 js,然后我有了我认为是一个完美的用例,这个新的“票选择”功能(多个源修改选择列表,++)。我想通过不重做整个应用程序来最小化风险。也许这是一个糟糕的选择?
  • 后续问题:我看到如何将 html 表绑定到“foreach: items”将为 VM 中的每一行提供一个关联项,但我的应用程序中的情况是该表不是应该由淘汰赛但由 jqgrid 动态创建。该表可能仅显示总票证集合中的 X 页中的 1 页。我不确定我是否已经足够好地解释了我的用例,但是您是否看到让 jqgrid 构建 html 表有任何矛盾,但是在创建每行时为每行附加一个复选框?对我的应用程序的这个有限部分使用淘汰赛可能是个坏主意。..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-15
  • 1970-01-01
  • 2012-03-11
  • 2017-11-07
  • 1970-01-01
  • 2017-03-06
相关资源
最近更新 更多