Search code examples
mvvmkendo-uicustom-events

Kendo MVVM and binding or extending custom events


I have a ComboBox in my page and I want to bind keypress event to my Kendo ComboBox when the cliend writes down any letter.

As I understand kendo doesn't have any keypress event on ComboBox.

I've found that kendo has something like this to bind values and functions:

kendo.data.binders.slide = kendo.data.Binder.extend({
        refresh: function () {
            var value = this.bindings["slide"].get();

            if (value) {
                $(this.element).slideDown();
            } else {
                $(this.element).slideUp();
            }
        }
    });

Source: Click Here

But the problem is I can't workaround that and make it to trigger keypress event on the InputBox in the KendoComboBox control.

Remember that I'm using MVVM and I don't want to use somthing like $('k-input').keypress(...); I want to actually add something in my kendo framework by manipulating the extend method that kendo provided for us.

Thank you in advance.


Solution

  • This one was more complicated than I thought it would be, but you can handle this by making a custom MVVM binder to attach to the keyPress event of the input element, like this:

    kendo.data.binders.widget.keyPress = kendo.data.Binder.extend({
        init: function (element, bindings, options) {
            kendo.data.Binder.fn.init.call(this, element, bindings, options);
            var binding = this.bindings.keyPress;
            $(element.input).bind("keypress", function(){binding.get();});
        },
        refresh: function () {}
    });
    

    You would bind that to a function on the view model.

    <input data-role="combobox"
        data-text-field="text"
        data-value-field="value"
        data-bind="keyPress: onKeyPress, source: data"></input>
    
    
    var viewModel = kendo.observable({
        data: [
            {text: "One", value: 1},
            {text: "Two", value: 2}
        ],
        onKeyPress: function () {
            $("#output").append("<div>keyPress</div>");
        }
    });
    

    Here is a working jsFiddle.