全局设置Kendo UI窗口值

时间:2017-10-06 14:09:12

标签: javascript kendo-ui kendo-asp.net-mvc kendo-window

我正在使用很多Kendo UI窗口。有没有办法在某种程度上全局指定默认值?或者更真实的版本,我可以用预定义的值创建一些父级,然后只覆盖我需要更改的值吗?

例如,我希望所有窗口都有相同的错误行为和模态参数,所以我想做类似的事情:

$("#parentWindow").kendoWindow({
     modal: true,
     error: function () {
          this.close();
          new Notification().error();
     }
});

然后使用父窗口作为新窗口的基础:

$("#newWindow").kendoWindow({
     title: "This window should have the options (modal and error) of the parentWindow",     
}).??getTheRestOfTheValuesFromParent()??;

或者重写一些参数:

$("#newWindow2").kendoWindow({
     modal: false,
     title: "A window with overwritten modal parameter",     
}).??getTheRestOfTheValuesFromParent()??;

在某种程度上可能实现这一点,是否有可能出现类似C#继承的东西? 也许这是一个愚蠢的问题,但我对JS并不熟悉。

3 个答案:

答案 0 :(得分:5)

我强烈建议您在所有 - 或者至少是那些更复杂的 - kendo小部件上创建自己的包装代码。我的团队多年来一直在这个项目中使用kendo来完成所有事情,我们正在取得非常积极的成果。主要目的是您需要的:全球行为。如果在您的项目上编码了数千个窗口后,您需要更改它们,只需更改包装器即可。它只是一个简单的jQuery函数:

$.fn.MyWindow = function(options) {
    var $target = $(this);
    var widget = {
        _defaultOptions: {
            actions: ["Minimize", "Maximize", "Close"],
            visible: false,
            width: 400,
            height: 400,
            modal: true
        },
        _options: options || {},
        _target: $target,
        _widget: null,

        _init: function() {
            this._manageOptions();
            this._createWidget();

            return this;
        },

        _manageOptions: function() {
            // Here you can perform some validations like displaying an error when a parameter is missing or whatever
            this._options = $.extend(this._options, this._defaultOptions);
        },

        _createWidget: function() {
            this._widget = this._target.kendoWindow(this._options).data("kendoWindow");

            // Create here some behaviours that the widget doesn't haves, like closing the window when user click the black overlay
            if (this._options.closeOnOverlayClick) {
                $('body').off('click', '.k-overlay').on('click', '.k-overlay', function() {
                    this._widget.close();
                }.bind(this));
            }
        },

        Show: function(center) {
            if (center) {
                this._widget.center();
            }

            this._widget.open();
        }
    };

    return widget._init();
};

var wnd = $("#wnd").MyWindow({
    title: "My first window",
    closeOnOverlayClick: true // Your own parameter
});

// Now you work with your own functions:
wnd.Show(true);

Demo

有很多自定义项,比如你自己的事件 - 其中一些kendo的小部件没有 - 等等。

答案 1 :(得分:3)

我将添加一篇关于创建自定义Kendo小部件的文章(here),您可以在其中找到有关可能实现的不同方案的细节的更多信息。

答案 2 :(得分:3)

Ι有一个类似你的案例有剑道窗口,剑道网格和剑道下拉列表。为此,我为所有元素创建了HtmlHelpers,并在需要时调用它们。由于你使用的是kendo asp.net-mvc,我建议你这样看。

    public static WindowBuilder GlobalKendoWindow(this HtmlHelper helper)
    {
        return helper.Kendo().Window()
            .Draggable()
            .Animation(true)
            .Visible(false)
            .AutoFocus(true)
            .Modal(true)
            .Scrollable(true)
            .HtmlAttributes(new { @class = "atn-modal-container" })
            .Actions(actions => actions.Minimize().Close())
            .Deferred();
    }

并在我的Html中呈现它,就像这样

@(Html.GlobalKendoWindow()
    .Name("addCandidateDialog")
    .Title(Html.GetResource(cps, "AddCandidateDialogTitle"))
    .LoadContentFrom("AddCandidate", "Candidate")
    .Events(events => events.Open("athena.addCandidacy.onAddCandidateOpen").Close("athena.addCandidacy.onAddCandidateClose"))
)