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

KnockoutJS how do I bind change event of select without firing during databinding?

在 KnockoutJS 中,我有一个数据绑定的 select,在添加更改事件时,我发现当控件数据绑定时我的事件被触发(显示当前 selected物品)。这很有道理,但我如何才能只处理那些由用户更改 selection?

触发的事件?

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

谢谢,

马克

恕我直言,订阅可观察对象本身对您想要的行为具有正确的行为。这里不需要监听 select change 事件。请参阅此示例:(学分: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));

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