【发布时间】:2013-02-14 15:19:48
【问题描述】:
我正在尝试通过下拉列表更新对象上预先存在的属性。该解决方案使用了 knockout 和 ko.mapping 框架来获取其数据。我遇到的问题是选择现有对象已经设置的列表中的项目。
例如:如果下拉列表包含 2 个选项,假设第一个男性和第二个女性,并且它所代表的属性已经设置为女性,我希望下拉列表选择女性。但下拉列表默认为列表中的第一项(男性)并将底层对象更新为男性。
我已经完成了上述的一个简单示例,我已经模拟了数据以匹配我正在处理的内容,即来自服务器的 json 使用 ko.mapping 框架进行映射。
视图模型
var listItems = '[{"id": "1","name": "male"},{"id": "2","name": "female"}]';
var savedRecord = '{"gender": {"id": "2","name": "female"}}';
ViewModel = function () {
mappedListItems = ko.mapping.fromJSON(listItems);
mappedSavedRecord = ko.mapping.fromJSON(savedRecord);
}
ko.applyBindings(new ViewModel());
html
<select data-bind="options: mappedListItems,
optionsText: 'name',
value: mappedSavedRecord.gender"></select>
<p>mappedSavedRecord.gender.name = <span data-bind="text: mappedSavedRecord.gender.name"></span>
JsFiddle
【问题讨论】:
-
您不需要指定
optionsValue,因此您可以在选择中包含复杂的对象,您只需要以不同的方式设置您的 mappedSavedRecord jsfiddle.net/xgKvx/1。 KO 通过引用比较复杂对象,因此您的mappedSavedRecord应该包含来自mappedListItems的实际项目。 id和gender一样还不够…… -
@nemesv 有趣的是,我已经尝试过这种方法,但是由于包含性别属性的对象有更多的事情发生,我只想设置性别属性,由于某种原因我不能t 工作。参见小提琴例如jsfiddle.net/tgriley1/9nzr4
标签: javascript html knockout.js knockout-mapping-plugin