Настройки области jQuery для плагина на основе плагинов / Авторской статьи - PullRequest
2 голосов
/ 22 октября 2011

У меня есть плагин jQuery, который следует примеру плагинов / авторинга с docs.jQuery.com, и у меня возникают трудности с выяснением, как сохранить уникальные настройки для каждого элемента, к которому применяется плагин.На странице есть два элемента, каждый из которых имеет плагин, примененный к ним отдельно.

Вот мой код на данный момент:

(function( $ ) {

/* Default settings */
var defaults = {
    id: null,
    properties: null,
    container: '.comp-settings', /* override for .retail or .distressed */
    priceLabel: '.comp-section-header span',
    slide: slideCallback,
    minRange: 100000
};

/* Some public here: $.compSlider('method', options) */
var methods = {
    init: function( options ) {

        var settings = $.extend( {}, defaults, options );

        return this.each(function() {
            $(this).slider( settings );
        });

    }
}

/* Some methods here */
function opt( name ) {
    return settings[ name ];
}

/* Plugin namespace */
$.fn.compSlider = function( method ) {
    // Method calling logic
    if ( methods[method] ) {
        return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
    } else if ( typeof method === 'object' || ! method ) {
        return methods.init.apply( this, arguments );
    } else if ( typeof method === 'string' ) {
        return this.slider( method, Array.prototype.slice.call( arguments, 1 ) );
    }
};

})( jQuery )

Проблемы:

  1. Переменная настроек недоступна в функциях плагинов
  2. Если я сохраню переменную настроек в $ (this) .data ('settings'), я все равно не смогу получить доступ к $ (this) .data ('settings').) из функции «opt», потому что «this» не является элементом (я считаю, что это окно DOM.)

Любая помощь приветствуется.

1 Ответ

1 голос
/ 22 октября 2011

Вы не можете получить доступ к настройкам в функции compSlider, потому что в вашем примере они определены в init(), что делает их локальными для этой функции.Если вы переместили объявление в область действия:

$.fn.compSlider = function( method, options ) {
    var settings = $.extend( {}, defaults, options );
};

Тогда вы сможете получить к ней доступ.Или достаточно просто определить его (var settings;) в compSlider и удалить var в init().

Обновление:

В ответ на ваш комментарий, да, извините, забыл опроблема № 2.Как таковой, вы не сможете получить доступ к настройкам для каждого объекта плагина, потому что вы не можете «опуститься» в области видимости.Другими словами, вы не можете получить доступ к локальной переменной функции извне этой функции.И это то, что является настройками, локальными для функции compSlider (если вы используете предложенную мной структуру), они имеют меньшую область действия с точки зрения вашей функции opt().

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

var compSliderObjects = [];

$.fn.compSlider = function( method, options ) {
    //store objects in compSliderObjects
};

Однако это всего лишь идея, и вам все равно нужно выяснить, как вы хотитечтобы получить доступ к compSliderObjects и вытащить правильные настройки.Будет ли у каждого объекта уникальный идентификатор?Если это так, массив объектов ({id: 2, settings: data}).Если нет, вам нужно выяснить, как вы хотите уникально идентифицировать их и извлечь их из массива.

Кроме того, вам действительно нужен глобальный доступ к ним?Это меньше работы и кода, чтобы просто вызвать объект и получить настройки (как показано на скрипке).

...