我最近发现了这个很棒的组件 - > Knockout-Kendo.js
我用它来处理kendoComboBox的一些行为。
与viewmodel的同步效果非常好。
我想监听控件的更改,以根据当前选定的值执行某些操作。
我没有看到任何可以绑定在'数据绑定中的属性。属性来监听更改但我知道在内部,knockout-kendo组件会监听更改,这就是视图模型能够与控件同步的方式。
如果我尝试监听控件的valueChange事件,问题是我的eventhandler在viewmodel之前被捕获,并且在我的eventhandler中运行时,我只是使用viewmodel获得了控件的先前值。
在组件中查看此绑定配置。我的理解是,我能够使用','搜索','数据','价值'以及telerik控件的任何其他公开属性。最好的方法是在data-bind属性中定义一个属性' change'在我的viewmodel中链接了一个eventhandler,并确保在knockout-kendo组件的内部事件处理程序之后调用我的eventhandler。
createBinding({
name: "kendoAutoComplete",
events: {
change: VALUE,
open: {
writeTo: ISOPEN,
value: true
},
close: {
writeTo: ISOPEN,
value: false
}
},
watch: {
enabled: ENABLE,
search: [SEARCH, CLOSE],
data: function(value) {
ko.kendo.setDataSource(this, value);
},
value: VALUE
}
});
我知道我可以尝试修改事件绑定的顺序,以确保在viewmodel同步后必须调用eventhandler,但我认为这是一个非常糟糕的做法。
任何人都知道如何用优雅来解决这个问题?
答案 0 :(得分:1)
您尚未提及为什么要执行此操作。我可以想象两个原因:
对于在后一种情况下登陆此问题的人,这是另一种解决方案。 (这个答案可能不是OP问题的直接答案,但似乎有用,可以在这里发布。)
假设您有这个基本视图模型:
var ViewModel = function() {
var self = this;
self.kendoObservable = ko.observable("Some text")
};
有两种方法可以间接响应Kendo的更改。首先,对于简单的情况,有computed observables:
// Option 1, add this to ViewModel
self.dependentObservable = ko.computed(function() {
return self.kendoObservable() === "" ? "Empty" : "Not empty"; // example
});
每次dependentObservable
更改时,都会修改此kendoObservable
。基本的东西。
如果您想在kendoObservable
更改时执行更复杂的操作,例如做一个AJAX调用或其他什么,你可能需要一个manual subscription:
// Option 2, add this to ViewModel
self.kendoObservable.subscribe(function(newValue) {
// Possibly do an AJAX call here or whatnot. Example:
alert("The new value is: " + newValue);
});
这将允许您在每次kendoObservable
更改时触发一些复杂的逻辑。 AFAIK您需要检查自己newValue
是否实际上是已更改值,至少在某些版本的KO中是这样。