2013-05-29 3 views
2

Я создаю плагин jQuery и хочу предложить несколько расширений, чтобы сделать решение более модульным. Я думаю, что у меня есть правильный синтаксис для выполнения расширения, но я не могу назвать какой-либо из методов моего расширения. Я только включил разделы кода, чтобы попытаться быть кратким, но при необходимости я могу предоставить больше. Любая помощь высоко ценится!Вызов метода в расширении jQuery

Я использую http://jqueryboilerplate.com/ для моего основного модуля и это StackOverflow ответ для добавления мои методы расширения: Best Way to Extend a jQuery Plugin

Главная JQuery плагин

function Plugin(element, options) { 
    this.element = element; 

    // jQuery has an extend method which merges the contents of two or 
    // more objects, storing the result in the first object. The first object 
    // is generally empty as we don't want to alter the default options for 
    // future instances of the plugin 
    this.options = $.extend({}, defaults, options); 

    this._defaults = defaults; 
    this._name = pluginName; 

    this.init(); 
} 

Plugin.prototype = { 

    init: function() { 

     //This line does NOT work 
     var id = this.showId(); 
     console.log(id); 

     var toolbar = this.createToolbar(this.options); 
     $(this.element).append(toolbar); 

     if(this.options.showPalette) 
     { 
      var palette = this.createPalette(this.options); 
      $(this.element).append(palette); 
      this.fetchPalette(); 
     } 

     var canvas = this.createCanvas(this.options); 
     $(this.element).append(canvas); 

    }, .... 

Plugin Конструктор

$.fn[pluginName] = function (options) { 
    return this.each(function() { 
     if (!$.data(this, "plugin_" + pluginName)) { 
      $.data(this, "plugin_" + pluginName, new Plugin(this, options)); 
     } 
    }); 
}; 

метод выдвижения

var extensionMethods = { 
    /* 
    * retrieve the id of the element 
    * this is some context within the existing plugin 
    */ 
    showId: function(){ 
     return this.element[0].id; 
    }, .... 

JQuery простираться

$.extend(true, $['fn']['workflowEditor'].prototype, extensionMethods); 

ответ

0

Я не вижу где-нибудь в вашем коде, где вы поддержка вызова методов плагина, будь то встроенный или добавлены позже как методы расширения.

Если намерение состоит в том, чтобы быть в состоянии назвать $(el).workflowEditor('mymethod', ...) таким же образом, как работает JQuery UI, то, возможно, вам нужно:

$.fn[pluginName] = function (options) { 
    var ns = "plugin_" + pluginName; // don't repeat yourself... 
    if (options instanceof object) { 
     return this.each(function() { 
      if (!$.data(this, ns)) { 
       $.data(this, ns, new Plugin(this, options)); 
      } 
     }); 
    } else { 
     var args = [].slice.call(arguments, 0); // copy args 
     var method = args.shift(); 
     return this.each(function() { 
      $['fn'][pluginName][method].apply($.data(this, ns), args); 
     }); 
    } 
}; 

, который должен вызвать Plugin.method с контекстом будучи удерживаемой Plugin объекта, и аргументы, будучи остаток списка аргументов.

Если вы вызываете $(el).workflowEditor({ ... }) (т. Е. С параметром объекта), то он свяжет плагин, как и раньше.

+0

Спасибо, с несколькими другими битами, я думаю, что у меня есть кости чего-то работающего. Посмотрел интерфейс jQuery. В основном, я просто пытаюсь разделить отдельные части моего плагина в разных файлах, чтобы избежать огромного файла javascript на 100 000 строк. – Mark

+0

@Mark должен работать, но не забывайте, что вы не можете делиться лексически ограниченными («частными») переменными между модулями кода. – Alnitak

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