首页 > 解决方案 > 创建 js 小部件时,如何获取我的小部件的实例?

问题描述

我正在尝试以 DevExtreme 的方式实现 widgits。

当他们创建一个文本框widgit时,代码如下:

$("#someContainer").dxTextBox({ options... });

当他们获得widgit的一个实例时,他们会这样做......

$("#someContainer").dxTextBox("instance");

到目前为止,这是我的小部件代码...

(function ($) {
    'use strict';

    $.myWidget = function (element, options) {

        var plugin = this;
        var $base = $(element);

        var defaultOptions = {
            id: null,
        };

        var opts = $.extend({}, defaultOptions, options);

        var me = new function () {
            var self = this;

            var init = {

                widgets: function () {
                    // Do some stuff          
                },

            };

            return {
                init: init,
            };

        };

        me.init.widgets();
    };


    $.fn.myWidget = function (options) {

        return this.each(function () {
            if (undefined === $(this).data('myWidget')) {
                var plugin = new $.myWidget(this, options);
                $(this).data('myWidget', plugin);
            }
        });

    };

})(jQuery)

有了这个,我可以创建一个像这样的小部件......

$("#someContainer").myWidget({ id: 1 });

但我希望能够获得小部件的一个实例,所以我可以做这样的事情:

$("#someContainer").myWidget("instance").showPopup();

并且:

var w = $("#someContainer").myWidget({ options... }).myWidget("instance");
w.showPopup();

如何获取实例?

标签: javascriptwidget

解决方案


您必须检测请求实例时的“特殊呼叫”。这里有一个小例子:

(function ($) {
    'use strict';

    $.myWidget = function (element, options) {

        var plugin = this;
        var $base = $(element);

        var defaultOptions = {
            id: null,
        };

        var opts = $.extend({}, defaultOptions, options);

        var me = new function () {
            var self = this;

            var init = {

                widgets: function () {
                    return {
                      hello: function(){
                        alert("it's me!");
                      }
                    }
                },
                
                

            };

            return {
                init: init,
            };

        };

        return me.init.widgets();
    };


    $.fn.myWidget = function (options) {

        if(options === "instance"){
          return $(this).data('myWidget');
        }

        return this.each(function () {
            if (undefined === $(this).data('myWidget')) {
                var plugin = new $.myWidget(this, options);
                $(this).data('myWidget', plugin);
            }
        });

    };

})(jQuery)


$("#someContainer").myWidget({ id: 1 });

$("#someContainer").myWidget("instance").hello()
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="someContainer"></div>


推荐阅读