更新knockout绑定以编程方式填充输入?

时间:2013-11-24 18:34:07

标签: knockout.js

我正在使用一个日期选择器,只要我从日历中选择日期,就会将一些文本推送到输入中。

我还有一些其他输入实例也通过第三方工具填充。

问题是,在重新绑定发生之前,我必须在输入后按输入中的某个键。如果我不这样做,那么observable不会更新。

类似的问题:knockout valueUpdate not working with Pagedown?

有没有办法手动重新绑定元素,所以当我按下“保存”时,这些可观察对象是否可以准确绑定?

2 个答案:

答案 0 :(得分:2)

作为 @ebohlman 所说的一个例子,

ko.bindingHandlers.datepicker = {
    init: function (element, valueAccessor) {
        var $el = $(element), value = valueAccessor;
        $el.datepicker({ 
            value: ko.unwrap(value),
            onChange: function(newValue){
                if (ko.isObservable(value)) {
                    value(newValue);
                }
            }
        });

        if (ko.isSubscribable(value)){
            value.subscribe(function(){
                $el.datepicker("set value", ko.unwrap(value));
            });
        }
    }
}

(这是使用Semantic-UI的模块模式,您的插件的API可能会有所不同)

答案 1 :(得分:0)

通常,您需要创建一个自定义绑定,该绑定使用窗口小部件提供的任何通知API(尽管首先检查是否有其他人尚未创建一个)。它实际上相当容易; Knockout的创建者认为编写自定义绑定是使用Knockout的常规方面(正如Angular的创建者考虑编写自己的指令是使用它的常规方面)。确切的细节取决于特定的小部件。

这是必要的原因是Knockout对输入元素的本机绑定会监听changekeypress等浏览器事件。但是,当以编程方式更改输入元素时,浏览器不会自动发出事件,因此绑定不知道发生了任何事情。