在淘汰赛中使用<select>如何获得所选项目以在启动时选择正确的项目</select>

时间:2012-06-22 02:17:38

标签: knockout.js coffeescript

给出这个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">

1 个答案:

答案 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/