我在select
绑定上下文中有一个with
。
<div data-bind="with: SelectedItem">
<select id="select" data-bind="options: $root.OptionsList, optionsText: 'description', optionsValue: 'opt_id', event: { change: $parent.OptionSelectionChanged }, optionsCaption: 'Select'"></select>
</div>
我本以为以下内容将包含$root.OptionsList
中所选项目的输出,但我却得到了$root.SelectedItem
。
function MyViewModel() {
self.OptionSelectionChanged = function(data, event) {
console.log(data) // outputs $root.SelectedItem
}
}
在此示例中,$root.OptionsList
是可应用于$root.SelectedItem
的属性的列表(这是$root.AvailableItems
中项目的克隆,后者是较大的关系型,对象)。
因此,当用户在更改事件中从包含$root.OptionsList
的Select中选择一个选项时,我会更新$root.SelectedItem.SelectedOptions
,这会导致UI更新并将Select重置为空以再次显示标题。 / p>
如何在更改事件中获取所选选项的值?我做错了什么,还是我的期望不正确/被误导了?我已经设法使用jQuery和event.CurrentTarget
来获取值,但我认为这似乎有点“错误”,即使它可以作为淘汰赛使用,但我应该向我发送在下拉列表中选择的值。
答案 0 :(得分:1)
我从来没有遇到过在select
绑定中使用with
绑定而不使用with绑定中与对象相关的选项的情况。将元素发送到with
处理程序时,binding context
绑定如何更改change
似乎也很奇怪。
但是,一种解决方法是在observable
对象上定义一个root
,以保存从dropdown
中选择的值,并在{{ 1}}控件
value
看看fiddle
答案 1 :(得分:0)
我仍然不确定为什么要在with:SelectedItem
中添加select。如果您在下拉菜单中选择默认的select
值,则该下拉菜单将完全不可见
这是一个有效的代码段,在加载时设置了默认的SelectedItem
function MyViewModel() {
const self = this;
self.SelectedItem = ko.observable(1);
self.OptionsList = ko.observableArray([{description: "1", opt_id:1},{description: "2", opt_id:2}])
self.SelectedItem.subscribe(function(data) {
console.log(data);
})
}
ko.applyBindings(new MyViewModel())
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<div data-bind="with: SelectedItem">
<select id="select" data-bind="options: $root.OptionsList, optionsText: 'description', optionsValue: 'opt_id', value: $root.SelectedItem, optionsCaption: 'Select'"></select>
</div>