在KnockoutJS中,我有一个数据绑定的选择,添加更改事件后,我发现控件绑定数据(显示当前选定的项目)时,我的事件正在被触发。这很合情合理,但是我该如何仅处理那些由用户更改选择触发的事件?
我的想法是,可能存在一种方法来判断敲除是否当前正在绑定数据。我发现,如果我使用KO事件:绑定,则可以在调用堆栈中搜索“ notifySubscribers”-我不喜欢这种方法。有人知道这样做的正确方法吗?
谢谢
标记
答案 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));
顺便说一句,只看一下订阅和计算出的可观察值之间的评估顺序。请注意,如何始终在订阅后评估计算结果。