Подтвердить что ты не робот

Доступ к экземпляру виджета из внешнего виджета

Это простой макет виджетов:

(function ($) {

    $.widget("ui.myDummyWidget", {

        options: {
        },

        _create: function () {
        },
        hide: function () {
            this.element.hide();
        },
        _setOption: function (key, value) {
            $.Widget.prototype._setOption.apply(this, arguments);
        },

        destroy: function () {
            $.Widget.prototype.destroy.call(this);
        }

    });

} (jQuery));

Он только добавляет метод hide, который вы можете вызвать, чтобы скрыть элемент. Легко, если сделано из виджета

this.hide();

Но распространенным сценарием является то, что вы хотите вызывать методы в экземпляре виджета извне (обновление Ajax или другие внешние события)

Итак, каков наилучший способ доступа к экземпляру виджета? Один из способов - добавить ссылку на виджет на элемент, уродливый...

_create: function () {
    this.element[0].widget = this;
},

Затем вы можете получить доступ к нему со стороны, делая

this.dummy = $("#dummy").myDummyWidget();
this.dummy[0].widget.hide();
4b9b3361

Ответ 1

Механизм виджета уже делает то, что вы хотите: он вызывает data() для привязки виджетами и их соответствующими элементами:

$("#dummy").myDummyWidget();
// Get associated widget.
var widget = $("#dummy").data("myDummyWidget");
// The following is equivalent to $("#dummy").myDummyWidget("hide")
widget.hide();

Обновление: Начиная с jQuery UI 1.9, ключ становится полнофункциональным именем виджета, с тире вместо точек. Поэтому приведенный выше код становится:

// Get associated widget.
var widget = $("#dummy").data("ui-myDummyWidget");

Использование неквалифицированных имен по-прежнему поддерживается в 1.9, но устарело, а поддержка будет уменьшена в 1.10.

Ответ 2

Вы также можете использовать пользовательский селектор jQuery для поиска элементов виджета перед вызовом данных на них, чтобы получить фактический экземпляр виджета, например.

$(this.element).find(":ui-myDummyWidget").each(function (index, domEle) {
    var widgetObject = $(this).data("myDummyWidget");
    widgetObject.hide();
    // this == domEle according to the jQuery docs
});

Этот код находит все экземпляры ui.myDummyWidget(обратите внимание на изменение периода. на дефис -), которые были созданы и прикреплены к другому держателю виджета.

Ответ 3

Я не уверен, в какой версии он был введен, но если все, что вы хотите сделать, это вызов метода виджетов, вы можете использовать это:

$("#myWidget").myDummyWidget("hide");

Где myWidget - это идентификатор элемента DOM, содержащий экземпляр вашего виджета. Это вызовет метод hide.

Если метод, который вам нужно вызвать, требует параметров, вы можете передать их после имени метода, например:

$("#myWidget").myDummyWidget("setSpecialAnswer",42);

Кроме того, вы можете искать все экземпляры вашего виджета, используя специальный селектор: widgetName и методы вызова на них. Следующий фрагмент кода вызовет метод hide для всех виджетов myDummyWidget.

$(":ui-myDummyWidget").myDummyWidget("hide");

Помните, что полное имя виджета составлено из префикса ( "ui" в примере) и имени виджета ( "myDummyWidget" ), разделенного счетом ( "-" ).

Вы должны использовать свой собственный префикс для своих пользовательских виджетов; "ui" обычно зарезервирован для предварительно созданных виджетах jQueryUI.

Надеюсь, это поможет.:)

Ответ 4

Существует также метод, созданный при определении виджета, вы можете просто вызвать метод instance для получения фактического экземпляра виджета следующим образом:

//Create the Instance
$("#elementID").myDummyWidget(options);

//Get the Widget Instance
var widget = $("#elementID").myDummyWidget("instance");

Или вы можете сделать это как однострочный:

var widget = $("#elementID").myDummyWidget(options).myDummyWidget("instance");