Javascript Knockout.js-防止在通过可观察对象设置值时触发更改事件绑定
我有一个具有以下绑定的DropDownList:Javascript Knockout.js-防止在通过可观察对象设置值时触发更改事件绑定,javascript,jquery,knockout.js,Javascript,Jquery,Knockout.js,我有一个具有以下绑定的DropDownList: <select data-bind="value: DropDownValue, event: { change: OnChange }"> <option value="1">Val 1</option> /* and more */ </select> 当用户从DropDownList中选择不同的值时,OnChange事件将正确触发 使用
<select data-bind="value: DropDownValue, event: { change: OnChange }">
<option value="1">Val 1</option>
/* and more */
</select>
当用户从DropDownList中选择不同的值时,OnChange事件将正确触发
使用viewModel.DropDownValue1更新observable属性的值时,也会触发该事件
我试图实现的是,仅当用户通过UI设置值时才触发更改事件
在通过可观察对象更新值时,是否可能阻止更改事件
这是JSFIDLE示例:看起来有一种方法是在用户操作生成事件时使用事件对象true,在脚本生成事件时使用false:
self.OnChange = function(viewModel, event) {
if(event.isTrusted) {
console.log("from dropdown");
return;
} else {
console.log("NOT from dropdown");
// do something
}
};
看
编辑
当然,如果您想阻止用户通过UI更改下拉列表,您必须实现某种机制:
function ViewModel() {
var self = this;
self.DropDownValue = ko.observable();
self._original = null;
self.OnChange = function(viewModel, event) {
if(event.isTrusted) {
// rollback the viewModel value to the old one
viewModel.DropDownValue(self._original)
return false
} else {
// keep a reference to the latest value for later rollback
self._original = ko.unwrap(viewModel.DropDownValue)
}
};
};
查看此您不使用选项绑定的任何特定原因?因此我不知道为什么您必须更改模型中的值,而您不想更改?您的示例有一个错误,这里是non-error-example@cl3m-我使用值绑定,因为DropDownList已经在HTML上呈现了所有必要的选项。使用选项绑定,您必须提供一个对象数组,并让knockout为您创建HTML@Matt.k-我想更改模型值,我不想在更改时触发更改事件。只有当用户通过UI更新该值时,一种方法似乎是使用事件对象的isTrusted属性,isTrusted属性才是解决方法。但传递给该函数的事件是jQuery.event,不会直接公开isTrusted属性。因此,我们需要使用event.originalEvent.istrusted该属性在小提琴中公开。我确信有一个兼容性技巧,发现它做得很好!