针对selectbox的页面加载的Knockout订阅触发器

时间:2017-01-31 09:21:53

标签: javascript knockout.js

我使用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 });

当你运行它时,尽管没有更改值,仍会触发选择框扩展器?

1 个答案:

答案 0 :(得分:2)

value属性为string,因此,淘汰赛会尝试将值["1", "2", "3"]与您的观察值匹配,该观察值包含数字1或{{1} }。它没有看到选定的值,因此它会将您的observable更新为第一个2

要获得快速解决方案,请将<option>更改为selectbox,将强制值更改为ko.observable("1")

与问题无关的其他建议:

您当前的扩展程序将始终触发两次订阅更改。一个用于第一次更改,另一个用于实际重置。如果将observable包装在读/写计算中,则可以反击:

"2"