KnockoutJS如何绑定选择的更改事件而不在数据绑定期间触发?

时间:2019-07-29 11:18:05

标签: knockout.js

在KnockoutJS中,我有一个数据绑定的选择,添加更改事件后,我发现控件绑定数据(显示当前选定的项目)时,我的事件正在被触发。这很合情合理,但是我该如何仅处理那些由用户更改选择触发的事件?

我的想法是,可能存在一种方法来判断敲除是否当前正在绑定数据。我发现,如果我使用KO事件:绑定,则可以在调用堆栈中搜索“ notifySubscribers”-我不喜欢这种方法。有人知道这样做的正确方法吗?

谢谢

标记

1 个答案:

答案 0 :(得分:0)

订阅可观察对象的

IMHO具有您想要的正确行为。此处无需监听select更改事件。参见以下示例:(信用:rniemeyer)

<select data-bind="options: choices, optionsText: 'name', value: choice"></select>

ko.observableArray.fn.find = function(prop, data) {
  var valueToMatch = data[prop]; 
  return ko.utils.arrayFirst(this(), function(item) {
    return item[prop] === valueToMatch; 
  });
};

function ViewModel(choices, choice) {
  this.choices = ko.observableArray(choices);
  this.choice = ko.observable(this.choices.find("id", choice)); 
  this.choice.subscribe(function(v) {
    console.log("Subscription: ",v);
  });
  this.choiceTracker = ko.computed(function() {
    var v = this.choice();
    if(!ko.computedContext.isInitial()) {
      console.log("Computed: ", v);
    }
  }, this);
};

var choices = [
  { id: 1, name: "one" },
  { id: 2, name: "two" },
  { id: 3, name: "three" }
];

var choice = { id: 2, name: "two" };

ko.applyBindings(new ViewModel(choices, choice));

顺便说一句,只看一下订阅和计算出的可观察值之间的评估顺序。请注意,如何始终在订阅后评估计算结果。

相关问题