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));
顺便说一句,看看订阅和计算可观察对象之间的评估顺序。请注意如何始终在订阅后计算计算值。
在 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));
顺便说一句,看看订阅和计算可观察对象之间的评估顺序。请注意如何始终在订阅后计算计算值。