我使用subscribe创建了一个扩展器,目的是拦截用户更改输入字段并强制设置值。
例如,我在一个observable上设置了一个强制值“Bar”。如果用户将其更改为“Foo”,我将强制它为“Bar”并通知用户。 (这是原型/示例解决方案)。
适用于文本框和单选按钮,但不适用于选择框。它似乎是在页面加载时触发,而不仅仅是在更改时触发。
小提琴:https://jsfiddle.net/4gus57pd/7/
ko.extenders.forcedValue = function(target, newValue) {
target.subscribe(function(writtenValue) {
console.log(target()+" - "+newValue);
if(newValue != writtenValue){
alert("In this example we will use the value "+newValue+" instead.");
}
target(newValue);
});
return target;
};
this.textbox = ko.observable("Foo").extend({ forcedValue: "Bar" });
this.selectbox = ko.observable(1).extend({ forcedValue: 2 });
当你运行它时,尽管没有更改值,仍会触发选择框扩展器?
答案 0 :(得分:2)
value
属性为string
,因此,淘汰赛会尝试将值["1", "2", "3"]
与您的观察值匹配,该观察值包含数字1
或{{1} }。它没有看到选定的值,因此它会将您的observable更新为第一个2
。
要获得快速解决方案,请将<option>
更改为selectbox
,将强制值更改为ko.observable("1")
。
与问题无关的其他建议:
您当前的扩展程序将始终触发两次订阅更改。一个用于第一次更改,另一个用于实际重置。如果将observable包装在读/写计算中,则可以反击:
"2"