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

标签 javascript jquery knockout.js

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

<select data-bind="value: DropDownValue, event: { change: OnChange }">
    <option value="1">Val 1</option>
    /* and more */
</select>

当用户从 DropDownList 中选择不同的值时,会正确触发 OnChange 事件。

当使用 viewModel.DropDownValue(1) 更新可观察属性的值时,也会触发该事件。

我想要实现的是,仅当用户通过 UI 设置值时才触发更改事件。

通过observable更新值时是否可以阻塞change事件?

这是 JSFiddle 示例:https://jsfiddle.net/5ex5j7jL/3/

最佳答案

看起来一种方法是使用 the isTrusted property event 对象(true 当事件由用户操作生成时,false 当由脚本生成时):

self.OnChange = function(viewModel, event) {
  if(event.isTrusted) {
    console.log("from dropdown");
    return;
  } else {
    console.log("NOT from dropdown");
    // do something
  }
};

参见 updated fiddle

编辑

当然,如果你想阻止用户通过 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)
      }
    };
};

查看此 updated fiddle

关于javascript - Knockout.js - 在通过可观察对象设置值时防止更改事件绑定(bind)触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36427874/

相关文章:

jquery - 使用 jquery 显示/隐藏元素

javascript - 使用 knockoutjs 延迟加载图像

javascript - 使用ko.mapping.fromJS后指定对象类型

javascript - 如何从html表格中的多个单元格中获取复选框?

javascript - 从存储在对象中的元素获取数据

javascript - jQuery AnythingSlider - 在初始设置后更改属性

javascript - Redis数据操作

forms - 输入类型=重置和 knockout

javascript - vue-material:未知的自定义组件 md-drawer & md-content

javascript - 如何使用reduce按json分组?