1

http://jsfiddle.net/CsrrD/

给定一个对象

var viewModel = {
    Opts: ko.observableArray([
    { d: 'a', v: 0, selected: 1},
    { d: 'b', v: 1, selected: 1},
    { d: 'c', v: 2, selected: 1},
    { d: 'd', v: 3, selected: 2},
    { d: 'e', v: 4, selected: 1},
    { d: 'f', v: 5, selected: 1}
    ]), 
    selectedOpts: ko.observableArray([])
};

我想绑定一个多选列表来改变'selected'属性的值,1为假,2为真。(它在服务器上的表示方式 - 它实际上是状态代码)

<select data-bind="options: Opts,
    optionsText: 'd',
    optionsValue: 'v',
    selectedOptions: selectedOpts,
    optionsCaption: 'Choose...'" multiple=""></select>

​我知道如果我可以将 selectedOptions 绑定绑定到 selected 属性,我将不需要 selectedOpts 对象,我只是不知道如何简单地执行此操作而无需设置手动订阅 selectedOpts 以查看值列表并手动在每个已选择的项目上设置 selected 属性。

我相信有一个简单的方法。

谢谢

4

2 回答 2

2

没有一种方法可以自动执行您想要的操作。

您将拥有的一些选项:

  • 如您所示,设置对 observableArray 的手动订阅,并循环选项以根据它是否在数组中来设置值
  • 创建您的选项,以便它selected是一个计算的 observable,它会根据它是否在数组中来保持自身更新。缺点是每个选项都会有一个计算,只要 observableArray 更新就会触发(效率低于单个手动订阅)
  • 编写一个自定义绑定,在绑定中查找selectedOptions并执行订阅。也许你会提供一个函数来执行每个选项,如:http: //jsfiddle.net/rniemeyer/ds2aE/
于 2012-06-13T13:46:09.813 回答
0

手动订阅并不那么可怕,而且非常有用。我已经修改了您的小提琴,以演示如果您只是使选定的属性可观察,这将是多么容易:

http://jsfiddle.net/CsrrD/4/

从设计的角度来看,订阅功能可能应该存在于您的 viewModel 对象中,并且您可能希望使用映射插件来避免手动创建可观察对象,但您明白了。

于 2012-06-13T13:55:53.350 回答