Javascript Knockout.js-防止在通过可观察对象设置值时触发更改事件绑定

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事件将正确触发 使用

我有一个具有以下绑定的DropDownList:

<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该属性在小提琴中公开。我确信有一个兼容性技巧,发现它做得很好!