Запутался с объявлением, используя функции, которые будут вызываться из плагина jquery - PullRequest
1 голос
/ 29 июля 2011

Я пишу свой первый плагин jquery. Я сделал базовое кодирование и теперь хотел бы изменить код внутри и поместить некоторые разделы внутри функций. Обратите внимание, что я не хочу вызывать эти функции извне плагина. Частные функции, я думаю. Это логика, которую я хочу изложить -

(function($) {

    $.fn.filterGroup = function(method) 
    {

        var someParam,someOtherParam;  //declared here and values updated inside someFunction(), anotherFunction()


        return this.each(function() 
        {
            //plugin code starts here   
            this.someFunction();


            alert(someParam); //I want updated value of someParam to be available here

            $(inputTextField).keyup(function() 
            {//as user enters input into an input field
                inputText = $(inputTextField).val();

                //call a function here on this and does some modification on it.
                            this.anotherFunction();  //move a lot of lines inside this function

                 //on subsequent keyups, I want the updated value of someOtherParam to be available here
                 alert(someOtherParam );
            }


        });


        //not sure where and how to declare these functions ... these needs to be called from inside the plugin only (private functions)
        someFunction = function(filterText)
        {
            //some logic on the passed this, not sure if my sentence is correct in terms of jquery...

            //var someParam is updated here
            someParam = "something";
        }

            anotherFunction = function(filterText)
        {
            //var someOtherParam is updated here
            someOtherParam = "something";
        }
    });

})(jQuery);

Мой вопрос -

  • как и где я могу определить someFunction(), чтобы я мог назвать его как this.someFunction();.
  • И мне нужно иметь возможность прочитать обновленное значение someParam во время последующих событий onkeyup().

Я проверил раздел Пространство имен в http://docs.jquery.com/Plugins/Authoring, но похоже, что он касается публичной функции, которая вызывается извне.

Также проверил эти вопросы -

Использование функций из плагина и некоторых других, но я в замешательстве.

1 Ответ

0 голосов
/ 25 апреля 2012

Вот как я это сделаю:

(function($) {

    // this object is available only inside of this function
    var methods = {
        init:function(options){

            if(typeof options =="object") settings = $.extend(settings,options);

            return this.each(function(){
                methods._someFunction();

                // all values are available here by private settings object
                alert(settings.someParam);

                $(this).keyUp(function(){
                    methods._someOtherFunction();

                });
            });

        },
        _someFunction:function(filterText) {
            settings.someParam = "something";
        },
        _anotherFunction:function(filterText) {
            settings.someOtherParam = "something";
        }
    }

    // that one too
    var settings = {
        someParam:null,
        someOtherParam:null
    }

    $.fn.filterGroup = function( method ) {
        // second condition here will disable calling functions starting from "_".
        //   ex. `$(selector).filterGroup('_someFunction');` will return error
        if( methods[method] && method[0]!=="_" ) return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
        else if ( typeof method === 'object' || ! method ) return methods.init.apply( this, arguments );
        else $.error( 'Method ' +  method + ' does not exist on jQuery.tooltip' );
    });

})(jQuery);

На что обратить внимание:

  1. this в jQuery (особенно в плагинах) ссылка на объект, для которого был вызван плагин. Поэтому this.html() вернет содержимое этого объекта;
  2. Итак, как я писал выше, вам не следует извлекать данные из $(inputTextField).val(), а вместо этого вызывать свой плагин для таких объектов, как: $(inputTextField).filterGroup(), а затем в init() ссылаться на их значение как this.val() или * 1017. * если предыдущая по какой-то причине не сработает;
  3. Если вы собираетесь хранить более чем один объект данных в настройках, лучше сделать другой объект с именем data, который будет списком всех данных элемента :);
  4. Подробнее: http://docs.jquery.com/Plugins/Authoring;
...