Расширяете плагин jquery или строите миксины поверх базового плагина? - PullRequest
0 голосов
/ 08 марта 2012

У меня есть основной плагин, написанный в соответствии с jQuery-руководством .Этот плагин реализует некоторые основные функции для ul элементов (activate, deactivate и search).

jquery.myplugin.core.js

(function($) {
    var methods = {
        init : function(opts){
            var options = $.extend({}, $.fn.list.defaults, opts);
            return this.each(function(i) {
                ...
                methods.search("my search query"));
            });
         },
         deactivate : function(){ ... },
         activate : function(){ ... },
         search : function(query){ ... },
    };
    $.fn.list = function(method){
        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 {
            $.error( 'Method ' +  method + ' does not exist on jQuery.list' );
        }
};
    $.fn.list.defaults = {...};
})(jQuery);

У меня в приложении множество списков, каждый из которых выполняет разные действия - некоторые функции обмена.Например;два списка можно считать удаляемыми , так что элементы могут быть удалены из них.Есть ли способ написать эти дополнительные наборы функций как миксины или расширенные плагины основного плагина?

Так что я бы хотел:

  • jquery.myplugin.core.js
  • jquery.myplugin.editable.js
  • jquery.myplugin.deletable.js
  • ...

Я посмотрел BestСпособ расширения плагина jQuery , который заставил меня задуматься о:

jquery.myplugin.deletable.js

(function($) { 
    var extensionMethods = {
        delete : function(elem){ console.log("deleting "+elem); }
    };

$.fn.list.deletable = function(){ return $.extend(true, $.fn.list.prototype, extensionMethods); };

})(jQuery);

, который, как я думал, позволил бы мнесделайте:

>>> $('#list').list.deletable();
>>> $('#list').list.deletable("delete", elem);
>>> $('#list').list.deleteable("search", "some element"); # Method from core

но ничего не происходит, так как я уверен, что есть что-то, что я не правильно понимаю.Может кто-нибудь помочь мне здесь?

1 Ответ

0 голосов
/ 08 марта 2012

Вы можете создать плагин, который вызывает оригинальный плагин,

http://jsfiddle.net/JLcrm/

(function($){
    var methods = {
        "delete": function() {
            console.log("delete");
            return this;
        }
    };
    $.fn.deleteable = function(method) {
        if (methods[method]) {
            return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
        } else if (typeof method === 'object' || !method) {
            return $.fn.list.apply(this,arguments);
        } else {
            try {
                return $.fn.list.apply(this,arguments);
            } catch (e) {
                $.error('Method ' + method + ' does not exist on jQuery.delete');
            }
        }
    };
})(jQuery);

$(document).list().list("search")
$(document).deleteable().deleteable("delete");

В вашем коде есть некоторые опечатки, я исправил их в скрипке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...