给出这个coffeescript
data =
Foo: "B"
Foos: [ "A", "B" ]
Blah:
Id: 2
Name: "B"
Blahs: [
Id: 1
Name: "A"
,
Id: 2
Name: "B"
]
class Vm
constructor: (data) ->
@Blah = ko.observable()
ko.mapping.fromJS data, {}, this
vm = new Vm(data)
console.log vm
ko.applyBindings vm;
然后给出这两个下拉式绑定......
<select data-bind="options: Blahs,optionsText: 'Name', value: Blah">
<select data-bind="options: Foos, value: Foo">
小提琴: -
http://jsfiddle.net/keith_nicholas/3eYHd/
Foo的字符串在启动时正确设置选定的选项,带有对象的那个,Blah,没有(事实上它将所选项目更改为列表中的第一个)
是否有简单的方法使对象的选择与带字符串的选择相同?
注意:我可以做类似
的事情http://jsfiddle.net/keith_nicholas/LJpJw/
replaceWithMatching = (prop, list, match) ->
prop (x for x in list when x[match]() == prop()[match]())[0]
然后
replaceWithMatching @Blah, @Blahs(), "Id"
将现有对象映射到列表中存在的对象。但我正在寻找一些更清洁/声明的东西,可能是这样的东西: -
喜欢<select data-bind="options: Blahs,optionsText: 'Name', matchOn: 'Id', value: Blah">
答案 0 :(得分:1)
当您绑定value
绑定中的对象时,它们需要是对同一对象的引用。
基本上:
var a = { name: "Bob" };
var b = { name: "Bob" };
var c = b;
alert(a === b) //false
alert(b === c) //true
因此,在您的示例中,您可以先定义选择数组,然后将所选值初始化为该数组中的一个对象。
以下是您更新的示例:http://jsfiddle.net/rniemeyer/ampys/