Публичные функции из плагина jQuery - PullRequest
32 голосов
/ 23 июня 2009

Мне нравится архитектура плагина jQuery, однако я нахожу это разочаровывающим (возможно, из-за недостатка понимания с моей стороны), когда я хочу сохранить ссылку на экземпляр плагина для доступа к свойствам или методам позже в моем коде.

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

Давайте рассмотрим значок загрузки AJAX. В более традиционной среде ООП я мог бы сделать:

var myIcon = new AJAXIcon();
myIcon.start();
//some stuff
myIcon.stop();

Методы и свойства моего объекта хранятся в переменной для последующего использования. Теперь, если я хочу иметь такую ​​же функциональность в плагине jQuery, я бы назвал его из своего основного кода примерно так:

$("#myId").ajaxIcon()

По договоренности, мой плагин должен возвращать исходный объект jQuery, переданный моему плагину, с учетом цепочки, но если я это сделаю, я потеряю возможность доступа к методам и свойствам экземпляра плагина.

Теперь я знаю, что вы можете объявить публичную функцию в моем плагине, что-то вроде

$.fn.ajaxIcon = function(options) {
    return this.each(function () {
        //do some stuff
    }
}

$.fn.ajaxIcon.stop = function() {
    //stop stuff
}

Однако, не нарушая соглашения о возврате исходного объекта jQuery, я не могу сохранить ссылку на конкретный экземпляр плагина, на который я хочу сослаться.

Я хотел бы иметь возможность сделать что-то вроде этого:

var myIcon = $("myId").ajaxIcon(); //myIcon = a reference to the ajaxIcon 
myIcon.start();
//some stuff
myIcon.stop();

Есть мысли?

Ответы [ 4 ]

90 голосов
/ 25 июня 2009

Если вы делаете что-то вроде следующего:

(function($){

$.fn.myPlugin = function(options) {
    // support multiple elements
    if (this.length > 1){
        this.each(function() { $(this).myPlugin(options) });
        return this;
    }

    // private variables
    var pOne = '';
    var pTwo = '';
    // ...

    // private methods
    var foo = function() {
        // do something ...
    }
    // ...

    // public methods        
    this.initialize = function() {
        // do something ...
        return this;
    };

    this.bar = function() {
        // do something ...
    };
    return this.initialize();
}
})(jQuery);

Затем вы можете получить доступ к любому из ваших открытых методов:

var myPlugin = $('#id').myPlugin();

myPlugin.bar();

Это взято из этой очень полезной статьи (май 2009 г.) из trueevil.com, которая сама по себе является расширением этой статьи (октябрь 2007 г.) от learningjquery.com.

2 голосов
/ 23 июня 2009

Хорошо, я понял, как это сделать:

Код плагина:

$.ajaxIcon.init = function(element, options) {
    //your initialization code

    this.start = function() {
         //start code
    }

    this.stop = function() {
         //stop code
    }
}

$.fn.ajaxIcon = function(options) {
    this.each(function () {
        //This is where the magic happens
        jQuery(this).data('ajaxIcon', new jQuery.ajaxIcon.init(this, opts));
    });

return this;
}

Затем использовать его где-нибудь еще в вашем коде:

var myIcon = $("#myId").ajaxIcon.data('ajaxIcon') 
// myIcon: a reference to the 'init' object specific to this plugin instance
myIcon.start();
myIcon.stop();

вуаля, ответил на мой собственный вопрос:)

0 голосов
/ 23 июня 2009

Я думаю, что вы могли бы достичь того, что вы ищете, с помощью чего-то подобного:

var myIcon = $("myId").ajaxIcon(); //myIcon = a reference to the ajaxIcon 
$.ajaxIcon.start(myIcon);//some stuff
$.ajaxIcon.stop(myIcon);

Хотя я не проверял это - у меня нет доступа к среде, где я могу это сделать.

0 голосов
/ 23 июня 2009

В большинстве плагинов jQuery, которые, как я вижу, я пытаюсь выполнить, будет использоваться анонимная область и замыкания для ссылки на функции и переменные, уникальные для этого экземпляра. Например, используя следующий шаблон:

;(function ($) {
    // your code
})(jQuery);

Между началом и концом модуля вы можете объявить любые функции, которые вы хотите. Вы не будете загрязнять глобальное пространство имен и можете сохранить доступ к локальным переменным через замыкания, которые могут решить многие ваши проблемы. Кроме того, не бойтесь использовать функции $.data.

...