繁体   English   中英

使用时的淘汰赛 <select>有对象时如何在启动时获取所选项目以选择正确的项目

[英]In knockout when using <select> how to get the selected item to select the correct item on startup when you have an object

给出这个咖啡脚本

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">

当您绑定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/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM