Вызов функции внутри функции для инициализации

;(function ($, w, d, config, undefined) {
$.fn.pluginName = function ( options, config ) {
    var pluginName = this;
    var defaults = {
        //defaults
    };
    var settings = $.extend({}, defaults, options);

    var methods = {
        init :  function ( settings, options ) {
            //init stuff here
        }
    }
})
})(jQuery, window, document)

// HTML looks like this
<script>
$('.item').pluginName({ methods : 'init' });
</script>

Я новичок в разработке плагинов и объектов в целом, но я пытаюсь учиться глубоко без плавок. :)

По сути, я хочу инициализировать свой плагин, вызвав функцию «init» в переменной методов. Имя моего плагина "pluginName".

У меня возникли проблемы с вызовом «init» fn, потому что он находится внутри переменной с именем «methods».

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

return this.each(function(){

    var $this       = $(this),
    data        = $this.data('pluginName');

    if ( ! data ) {
        $(this).data('pluginName', {
        target : $this
        });

    }
}).bind(this);

Приведенное выше возвращает «this.each не является функцией»

Любая помощь будет оценена по достоинству! Большое спасибо!!


person levelafter    schedule 28.06.2012    source источник


Ответы (1)


Чтобы вам не нужно было передавать объект для вызовов методов, я обычно использую такой формат:

(function($) {
    function doSomething() {
        // Only callable in this plugin's context (I think)
    }

    var methods = {
        init: function (options) {
            // Do whatever for init!
            doSomething();
        },

        anotherMethod: function (options) {
            // Some other method
            doSomething();
        }
    };

    $.fn.pollServer = function(method) {
        var args = arguments;
        var argss = Array.prototype.slice.call(args, 1);

        return this.each(function () {
            $this = $(this);
            if (methods[method]) {
                methods[method].apply($this, argss);
            }
            else if (typeof method === "object" || !method) {
                methods.init.apply($this, args);
            }
            else {
                $.error("Method " + method + " does not exist on jQuery.pollServer");
            }
        });
    };
})(jQuery);

И вы получаете к нему доступ, как:

$("#div").pollServer({});
$("#div").pollServer("init", {}); // Same as above line

$("#div").pollServer("anotherMethod", {});

Все внутри return this.each() определяет, какой метод вызывать, и устанавливает переменную this в качестве выбранного элемента jQuery. Он также передает дополнительные аргументы методам.

Надеюсь это поможет!

person Ian    schedule 28.06.2012
comment
Это ВЕЛИКОЛЕПНО!! Спасибо! Я буду работать с этим. Я уже написал другой шаблон, но ваш кажется гораздо более логичным. Я снова прокомментирую, как только реализую ваше решение, и дам вам знать, как оно работает! Большое спасибо за это! - person levelafter; 28.06.2012
comment
Без проблем! Я нашел нечто подобное где-то на веб-сайте jQuery, но немного изменил его, чтобы делать то, что я хочу. Это сработало для меня, поэтому я надеюсь, что это поможет вам! Дайте мне знать, если вам нужно больше указаний с чем-то вроде этого - person Ian; 28.06.2012
comment
Итак, я не хочу запутаться в своем коде. Функция инициализации работает прекрасно, СПАСИБО! Итак, у меня есть два новых вопроса, и я думаю, что я ЗОЛОТОЙ... Прежде всего. Как мне вызвать функцию из init? Помня, что она находится внутри переменной method. Кроме того, как мне вызвать функцию из pollServer(), опять же, используя функции внутри переменных методов? Будем очень признательны за любые примеры, которые вы можете привести с передачей аргументов! Вы мне уже ОЧЕНЬ помогли! СПАСИБО! - person levelafter; 28.06.2012
comment
Я добавил код ниже для лучшей справки. Это не 100%, у меня разные файлы сохранены с другими функциональными частями. Как только я смогу понять это, я смогу добавить эти функции :) - person levelafter; 28.06.2012