Knockout.js 在嵌套上下文中的更改事件处理程序中未获取正确的数据上下文

Knockout.js 在嵌套上下文中的更改事件处理程序中未获取正确的数据上下文,knockout.js,Knockout.js,我有一个select在一个绑定上下文的中 我原以为下面的输出包含$root.options list中的选定项,但我得到的是$root.SelectedItem 函数MyViewModel(){ self.options选择更改=功能(数据、事件){ console.log(data)//输出$root.SelectedItem } } 在本例中,$root.options列表是一个属性列表,可应用于$root.SelectedItem(它是$root.AvailableItems中的一个

我有一个
select
在一个
绑定上下文的


我原以为下面的输出包含
$root.options list
中的选定项,但我得到的是
$root.SelectedItem

函数MyViewModel(){
self.options选择更改=功能(数据、事件){
console.log(data)//输出$root.SelectedItem
}
}
在本例中,
$root.options列表
是一个属性列表,可应用于
$root.SelectedItem
(它是
$root.AvailableItems
中的一个项的克隆,它是一个较大的关系对象列表)

因此,当用户从更改事件I update
$root.SelectedItem.SelectedOptions
中的Select containing
$root.options list
中选择一个选项时,会导致UI更新并将Select重置为空以再次显示标题


如何在更改事件中获取所选选项的值?我是做错了什么,还是我的期望不正确/被误导了?我使用jQuery和
event.CurrentTarget
成功地获得了值,但这似乎有点“错误”,尽管它的工作原理是击倒,应将下拉列表中选择的值发送给我。

我从未遇到过这样的情况,即在
中使用
选择
绑定,而不使用与绑定中的对象相关的选项。另外,将元素发送到
change
处理程序时,带
绑定的
如何更改
绑定上下文似乎也很奇怪

但是,一种解决方法是在
根对象上定义一个
可观察的
,以保存
下拉列表中的选定值
,并在
选择
控件中使用
绑定

<div data-bind="with: SelectedItem">
  <select id="select" data-bind="options: $root.OptionsList, optionsText: 'description', optionsValue: 'opt_id', optionsCaption: 'Select', value: $root.selectedOption"></select>
</div>

请看一下

  • bidning的第一个参数是当前绑定上下文。在您的情况下,它是
    SelectedItem
  • 若要在下拉列表发生更改时调用该函数,请使用
  • 您需要将
    绑定添加到
    选择
我仍然不确定您为什么要在
中添加select:SelectedItem
。如果在下拉列表中选择默认的
select
值,则下拉列表将根本不可见

下面是一个加载时设置了默认值
SelectedItem
的工作代码段

函数MyViewModel(){
const self=这个;
self.SelectedItem=ko.可观察(1);
self.optionList=ko.observearray([{description:“1”,opt_id:1},{description:“2”,opt_id:2}]))
self.SelectedItem.subscribe(函数(数据)){
控制台日志(数据);
})
}
ko.applyBindings(新的MyViewModel())


在现实世界中,选项列表是可应用于SelectedItem.SomeProperties的属性列表,是在页面加载时填充的静态列表,可用于成为SelectedItem的任何项目。我将更新我的问题。我认为这会起作用,而且避免jQuery会更加“击倒友好”,我希望我做的击倒“错误”,但对这个库没有太多经验。我确实更新了我的答案,希望能提供一些关于我在做什么以及为什么这样做的清晰和背景。