2010-02-22 3 views
5

Я уже писал базовые плагины jQuery, но я изо всех сил пытаюсь разобраться в чем-то более сложном. Я ищу эмулировать API из JQuery UI, который работает следующим образом:Как я могу подражать API-интерфейсу JQuery?

$('#mydiv').sortable({name: 'value'}); // constructor, options 
$('#mydiv').sortable("serialize"); // call a method, with existing options 
$('#mydiv').sortable('option', 'axis', 'x'); // get an existing option 

Я попытался следующее:

(function($){ 
    $.fn.myPlugin = function(cmd){ 
     var config = { 
      default: 'defaultVal' 
     }; 

     if(typeof cmd === 'object'){ 
      $.extend(config, cmd); 
     } 

     function _foo(){ 
      console.log(config.default); 
     } 

     if(cmd==='foo'){ 
      return _foo(); 
     } 

     this.each(function(){ 
      // do default stuff 
     }); 
    } 
})(jQuery); 

$('#myElement').myPlugin({default: 'newVal'}); 
$('#myElement').myPlugin('foo'); 

То, что я хотел бы видеть здесь «newval» быть но я вижу 'defaultVal'; плагин вызывается и запускается с нуля каждый раз, когда я вызываю .myPlugin() для элемента.

Я также пробовал использовать _foo.call (это) и некоторые другие варианты. Нет радости.

В некотором смысле, я понимаю, почему это происходит, но я знаю, что это должно быть возможно сделать так же, как пользовательский интерфейс jQuery. Я просто не вижу, как!

(Я понимаю, что JQuery UI использует виджет фабрику для того чтобы обрабатывать все это, но я не хочу, чтобы это требование для плагина.)

+2

+1 - Отличный вопрос! Я просто изучаю jQuery самостоятельно, поэтому я не могу помочь, но я хотел бы дать вам удар :-) –

+0

Спасибо вам любезно :) –

ответ

4

Возможно, что вы хотите, это ...

(function($){ 

    var config = { 
     default: 'defaultVal' 
    }; 

    $.fn.myPlugin = function(cmd){ 

     if(typeof cmd === 'object'){ 
      $.extend(config, cmd); 
     } 

     function _foo(){ 
      console.log(config.default); 
     } 

     if(cmd==='foo'){ 
      return _foo(); 
     } 

     this.each(function(){ 
      // do default stuff 
     }); 
    } 
})(jQuery); 

$('#myElement').myPlugin({default: 'newVal'}); 
$('#myElement').myPlugin('foo'); 

Переместить переменную config за пределы функции myPlugin. Это изменение приведет к инициализации config только один раз: при создании вашей функции плагина.

+2

Gah! вы отправили, прежде чем я закончил печатать. – NVRAM

+0

Спасибо, это похоже на трюк! Простое решение, и теперь это кажется очевидным. Я знал, что это смотрит мне в лицо. :) –

2

Вы объявляя конфигурации во время функции вызова, а не в качестве крышки, используемой им. Попробуйте это:

(function($){ 
    var config = { 
     default: 'defaultVal' 
    }; 
    $.fn.myPlugin = function(cmd){ 

     if(typeof cmd === 'object'){ 
      $.extend(config, cmd); 
     } 

     function _foo(){ 
      console.log(config.default); 
     } 

     if(cmd==='foo'){ 
      return _foo(); 
     } 

     this.each(function(){ 
      // do default stuff 
     }); 
    } 
})(jQuery); 

$('#myElement').myPlugin({default: 'newVal'}); 
$('#myElement').myPlugin('foo'); 

Кроме того, вы можете посмотреть в jQuery data API для кэширования данных, особенно, если вы не собираетесь иметь только один экземпляр на каждой странице.

+0

Просто хотел сказать спасибо за ваш ответ. Весьма признателен. –

+0

Конечно. Кстати, вы можете переместить другие функции вне «функции». Посмотрите, как jQuery определяет его функции: ** {_foo: function (p1, p2) {....}, _bar: function (p1) {...}} ** – NVRAM

+0

Да, я тоже это сделаю , держите их организованными. Еще раз спасибо. –

Смежные вопросы