使用Knockout-Kendo.js处理ViewModel的当前属性值

时间:2014-04-28 02:26:43

标签: javascript knockout.js kendo-ui

我最近发现了这个很棒的组件 - > 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,但我认为这是一个非常糟糕的做法。

任何人都知道如何用优雅来解决这个问题?

1 个答案:

答案 0 :(得分:1)

您尚未提及为什么要执行此操作。我可以想象两个原因:

  • 直接触发某些UI行为/逻辑;
  • 触发业务逻辑(当然可能会触发UI更改);

对于在后一种情况下登陆此问题的人,这是另一种解决方案。 (这个答案可能不是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中是这样。