Извикване на функция в рамките на функция за инициализиране

;(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".

Освен това, за да направя тази стъпка напред, трябва да събера всички класове "item" на страницата и да задам вътре променлива за данни. В моята init функция имам следното:

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 работи прекрасно, БЛАГОДАРЯ! Така че имам два нови въпроса и мисля, че съм ЗЛАТЕН... Първо. Как да извикам функция от init? Не забравяйте, че тя е в променливата на методите. Също така, как бих извикал функция от pollServer(), отново, използвайки функциите в променливата на методите? Всички примери, които можете да дадете с предаване на аргументи, ще бъдат високо оценени! Вече ми помогнахте МНОГО! БЛАГОДАРЯ ТИ! - person levelafter; 28.06.2012
comment
Добавих кода по-долу за по-добра справка. Не е 100%, имам различни файлове, записани с други функционални части. След като успея да разбера това, ще мога да добавя тези функции :) - person levelafter; 28.06.2012