将文本绑定到子对象的属性

kda*_*awg 4 javascript knockout.js

使用knockout.js,是否可以从服务器绑定到JSON对象的子对象的属性?具体来说,如果我从服务器给出一个如下所示的对象:

var obj = {
    list: [ { key: "a", value: 1 },
            { key: "b", value: 2 },
            { key: "c", value: 3 }        
        ],
    selected: {
        key: "",
        value: null  
    }
};
Run Code Online (Sandbox Code Playgroud)

我通过"映射"插件从这个javascript对象创建一个viewModel:

var viewModel = ko.mapping.fromJS(obj);
Run Code Online (Sandbox Code Playgroud)

我绑定list到这样的<select>标签:

<select data-bind="options: list, optionsText: 'key', 
                   optionsValue: 'value', 
                   value: selected">
</select>
Run Code Online (Sandbox Code Playgroud)

我已将该值指定为selectedviewModel 的属性.这意味着,在选择选项后,我可以成功查询viewModel.selected.key()viewModel.selected.value()在代码中获取最新值.

但是,我无法绑定要在跨度上显示的所选项目keyvalue数据.例如,这不显示我选择的值:

<span data-bind="text: selected.value"></span>
Run Code Online (Sandbox Code Playgroud)

我能做我想做的事吗?我是否需要使用真正的简单模板来建立适当的上下文(即:) selected

我的情况的例子在这里.我甚至尝试将子selected对象专门映射为一个可观察的本身,但没有运气(请参阅注释掉带有附加选项的映射调用).

RP *_*yer 8

您使用映射选项处于正确的轨道上.您可能希望selected成为可观察对象,因此当您在下拉列表中进行更改时,您的UI会更新.在你的情况下,它甚至可能是空的.

需要注意的一点是,当映射插件处理如下对象时:

selected: { key="", value=null }
Run Code Online (Sandbox Code Playgroud)

它会产生keyvalue观察,但不是selected.

您遇到的另一个问题是您的第一个选择指定optionsValue: 'value'.这将导致它将value对象的属性写入selected而不是对象.

如果要自己编写对象,则需要完全删除optionsValue绑定.

以下是这些更新的小提琴:http: //jsfiddle.net/rniemeyer/Dubu9/2/