我正在使用一个日期选择器,只要我从日历中选择日期,就会将一些文本推送到输入中。
我还有一些其他输入实例也通过第三方工具填充。
问题是,在重新绑定发生之前,我必须在输入后按输入中的某个键。如果我不这样做,那么observable不会更新。
类似的问题:knockout valueUpdate not working with Pagedown?
有没有办法手动重新绑定元素,所以当我按下“保存”时,这些可观察对象是否可以准确绑定?
答案 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对输入元素的本机绑定会监听change
和keypress
等浏览器事件。但是,当以编程方式更改输入元素时,浏览器不会自动发出事件,因此绑定不知道发生了任何事情。