MVVM对自定义Kendo UI小部件的支持

阿尼卡

在我问这个问题并得到一个很酷的答案的前几天此后,我想知道是否可以使用我的自定义小部件,因为我通过mvvm约定使用了所有标准的kendo组件。我必须编辑自定义窗口小部件的哪些部分?例如:

<div id="dropdowns" data-role="linkeddropdowns" data-period="YEAR" 
    data-bind="year: selectedYear"></div>

谢谢,

拉斯·霍普纳(LarsHöppner)

我认为您可能会遇到内部视图模型方法的问题,因为Kendo UI往往对嵌套视图模型绑定不好。据我所知,所有Kendo UI小部件都因此在代码中创建了其内部小部件。

旁注:在窗口小部件中,您将DOM ID用于下拉列表元素-如果要在同一页面上创建多个窗口小部件,则会创建重复项。在这种情况下,最好使用类。

要启用year绑定,您需要一个自定义的活页夹,它可能看起来像这样:

kendo.data.binders.widget.year = kendo.data.Binder.extend({
    init: function (element, bindings, options) {
        kendo.data.Binder.fn.init.call(this, element, bindings, options);

        var that = this;
        that.element.bind("change", function () {
            that.change(); //call the change function
        });
    },
    refresh: function () {
        var that = this,
            value = that.bindings.year.get();

        this.element.setYear(value);
    },
    change: function () {
        var value = this.element.getYear();
        this.bindings.year.set(value);
    }
});

这可以与提供以下访问器的小部件一起使用:

getYear: function () {
    return this._getWidget("year").value();
},

setYear: function (value) {
    this._getWidget("year").value(value);
    console.log(this._getWidget("year"));
}

完整的窗口小部件示例(请注意,它尚未完全实现-仅考虑了年份绑定和期间设置):

(function ($) {
    var kendo = window.kendo,
        ui = kendo.ui,
        Widget = ui.Widget,
        periods = [
            { text: "PERIOD: YEAR", value: "YEAR" },
            { text: "PERIOD: QUARTER", value: "QUARTER" }
        ],
        quarters = [
            { text: "1. Quarter", value: 1 },
            { text: "2. Quarter", value: 2 },
            { text: "3. Quarter", value: 3 },
            { text: "4. Quarter", value: 4 }
        ],
        years = [2011, 2012, 2013, 2014];

    var LinkedDropDowns = Widget.extend({
        init: function (element, options) {
            var that = this,
                periodOption = $(element).data("period");
            if (periodOption) {
                this.options.period = periodOption;
            }

            Widget.fn.init.call(that, element, options);
            that._create();

          // make sure view state is correct depending on selected period
          this._getWidget("period").trigger("change");
        },

        options: {
            name: "LinkedDropDowns",
            period: "YEAR",
            periods: periods,
            year: 2011,
            years: years,
            quarter: 1,
            quarters: quarters,
            selectedYear: 2011
        },

        onPeriodChange: function (e) {
            switch (e.sender.value()) {
                case "YEAR":
                    $(this._getWidget("year").wrapper).show();
                    $(this._getWidget("quarter").wrapper).hide();
                    break;
                case "QUARTER":
                    $(this._getWidget("year").wrapper).show();
                    $(this._getWidget("quarter").wrapper).show();
                    break;
                default:
                    break;
            }
        },

        onChange: function () {
            // trigger change so the binder knows about it
            this.trigger("change", { sender: this }); 
        },

        _getWidget: function (name) {
            var el = $(this.element).find("input." + name).first();
            return el.data("kendoDropDownList");
        },

        _create: function () {
            var that = this;

            // create dropdowns from templates and append them to DOM
            that.periodDropDown = $(that._templates.periodDropDown);
            that.yearDropDown = $(that._templates.yearDropDown);
            that.quarterDropDown = $(that._templates.quarterDropDown);

            // append all elements to the DOM
            that.element.append(that.periodDropDown)
                .append(that.yearDropDown)
                .append(that.quarterDropDown);

            $(this.element).find(".period").kendoDropDownList({
                dataTextField: "text",
                dataValueField: "value",
                value: this.options.period,
                change: this.onPeriodChange.bind(that),
                dataSource: this.options.periods
            });

            $(this.element).find(".year").kendoDropDownList({
                dataSource: this.options.years,
                change: this.onChange.bind(this)
            });

            $(this.element).find(".quarter").kendoDropDownList({
                dataTextField: "text",
                dataValueField: "value",
                dataSource: this.options.quarters

            });
        },

        _templates: {
            periodDropDown: "<input class='period' />",
            yearDropDown: "<input class='year' style='width: 90px' />",
            quarterDropDown: "<input class='quarter' style='width: 110px' />"
        },

        getYear: function () {
            return this._getWidget("year").value();
        },

        setYear: function (value) {
            this._getWidget("year").value(value);
            console.log(this._getWidget("year"));
        }
    });

    ui.plugin(LinkedDropDowns);
})(jQuery);

演示

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

开发自定义Kendo ui小部件

来自分类Dev

带有MVVM和init事件的Kendo自定义窗口小部件-如何?

来自分类Dev

具有自定义文本支持的小部件

来自分类Dev

具有模板UI的自定义Gtk小部件

来自分类Dev

在Kendo ui mvvm中仍然无法对输入进行按键自定义绑定

来自分类Dev

自定义Kendo UI的网格

来自分类Dev

Bonita 7:支持JSON数据的自定义小部件属性类型

来自分类Dev

wxPython的文本小部件是否支持自定义文本装饰器?

来自分类Dev

TK的文本小部件是否支持自定义文本装饰器?

来自分类Dev

什么是Kendo UI自动完成小部件

来自分类Dev

kendo ui 外部模板小部件

来自分类Dev

在自定义Kendo小部件中使用AngularJS服务的最佳方法是什么?

来自分类常见问题

Flutter重用自定义小部件

来自分类Dev

自定义WooCommerce产品小部件

来自分类Dev

Yii中的自定义小部件

来自分类Dev

KIVY DragBehavior自定义小部件

来自分类Dev

Flutter重用自定义小部件

来自分类Dev

如何自定义android小部件

来自分类Dev

Yii中的自定义小部件

来自分类Dev

自定义小部件颤动

来自分类Dev

使用UI设计文件并使用自定义构造函数QT创建自定义小部件

来自分类Dev

如何替换具有自定义元素的JQuery UI小部件

来自分类Dev

Kendo UI Mobile listview的自定义过滤器?

来自分类Dev

kendo ui自定义命令的工具提示

来自分类Dev

Kendo UI网格中的自定义命令

来自分类Dev

Kendo UI Scheduler:如何创建自定义模板

来自分类Dev

自定义Kendo UI网格页脚-动态更新

来自分类Dev

如何自定义Kendo UI Donut Chart?

来自分类Dev

Kendo UI图表类别轴自定义视觉