JQuery UI Widget Factory получает контекст текущего виджета - PullRequest
2 голосов
/ 17 февраля 2012

Существует ли глобальная ссылка на сам виджет после того, как он был создан с использованием шаблона фабрики виджетов пользовательского интерфейса jQuery?

Я пытался сделать что-то вроде установки виджета var равным виджету:

$.widget("my.widget", {
  _widget: this,
  _create: function () {
    // _widget should == the whole widget
  }
});

Я также пытался захватить контекст виджета через jQuery, например:

$.widget("my.widget")

Я не могу понять, как вы должны иметь возможность перезвонить виджету,в то время как внутри виджета.

Ответы [ 2 ]

2 голосов
/ 02 мая 2012

В методе виджета вы ссылаетесь на экземпляр с помощью ключевого слова this:

$.widget('my.widget', {
    foo: true,
    _create: function () {
        var foo = this.getFoo();
    },
    getFoo: function () {
        return this.foo;
    }

});

Если вы находитесь в методе и обнаруживаете, что контекст изменился (как это часто бывает при написании jQuery), тогда вы можете просто сохранить ссылку на 'this' в локальной переменной:

$.widget('my.widget', {
    foo: true,
    _create: function () {
        var self = this;
        this.element.click(function () {
            var foo = self.getFoo();
        });
    },
    getFoo: function () {
        return this.foo;
    }

});
1 голос
/ 27 февраля 2016

Как упоминалось ранее, this является наиболее распространенным способом вызова функций виджета из виджета.

В вашем примере это не имеет смысла:

_widget: this

потому что вам нужен контекст уже для того, чтобы добраться до переменной _widget.

Иногда невозможно сохранить контекст в легко доступном месте, например, при создании обработчика события, которое не приходитнепосредственно из виджета.

Из Обучение использованию фабрики виджетов

Если вы можете получить управление, либо из экземпляра event.target, либо из идентификатораэлемент управления, вы можете вызывать функцию .data () для объекта jQuery, передавая имя виджета.Однако используйте тире вместо точки в имени виджета.

var $control = $('#' + myControlId);
var $widget = $control.data("my-widget");
$widget.getFoo();
...