2016-11-23 28 views
0

所以我用我的插件界面遇到了一點心理障礙。假設你有一個插件,當在jQuery選擇器上實例化時,迭代選擇並實例化每個選定元素的新對象/實例。假設這是我們必須與之合作的HTML:字符串標識符方法調用插件的特定實例

<p class='p1'> This is just a simple test paragraph </p> 
<p class='p2'> And here is another to show variety! </p> 

這是怎樣的插件被實例化:

$('p').pluginName(); 

現在,這兩個p標籤都被傳遞到插件的init,他們每個人都會收到他們自己的插件實例。當然,我可以使用這些類作爲更具體的標識符,但可以在這裏與我一起瀏覽。假設我現在想用一個字符串標識符調入插件做一些事情,因爲它的API允許像這樣:

$('p').pluginName('set', 'some_style'); 

但我只希望它適用於class p2比方說,有沒有什麼辦法來提供方法在上面調用有關特定實例的信息。或者因爲我覺得它更有可能,我是否必須更具體地使用我的實例化和方法調用來獲得我想要實現的實例?

我問,因爲在小範圍內,從一個插件調用到兩個實例化時不會那麼糟糕。但是如果這個插件要運行數百個元素呢?我不想強迫潛在用戶不得不在每一個元素上實例化,以保持能夠輕鬆地調用這些實例的能力,只要我能避免這種情況。

其他一些信息...

每個元素與data-cl-uid屬性相關聯持有一些國家的東西獨有的元素/實例的ID以及參考。除此之外,它還可以作爲一個分組機制,因此當兩個具有相同ID的實例都適用時,它們都會受到影響。我覺得我的設計讓我回到了一個角落,但我不是一個有足夠經驗的插件設計師,找到一條明確的道路前進。

希望這給出了一些上下文,這是處理插件本身的代碼,以及插件基於傳遞給它的代碼的作用,也就是當您使用字符串標識符調用實例或實例組時發生的情況:

$.fn[pluginName] = function (option) { 
    var args = arguments; 

    if (typeof option === 'object' || !option) { 
     this.each(function() { 
     if(!$.data(this, 'plugin_'+pluginName)) 
      $.data(this, 'plugin_'+pluginName, new Clicklight(this, option, args[1])); 
     else { 
      console.log('ERROR: Cannot create a duplicate object for ',this); 
      return false; 
     } 
     }); 

    } else if (typeof option === 'string' && option in pubAPI) { 
     this.each(function() { 
     var instance = $.data(this, 'plugin_'+ pluginName); 

     if (instance instanceof Clicklight && typeof instance[option] === 'function') 
      instance[option].apply(instance, Array.prototype.slice.call(args, 1)); 
     else { 
      console.log('ERROR: Internal error from \''+option+ '\''); 
      return false; 
     } 
     }); 

    } else 
     console.log('ERROR: No method found with name \''+option+ '\''); 

    return this; 
    } 

希望這是足夠的信息來解決我的問題和所有需要的代碼來顯示問題的存在。任何其他信息,我會很樂意編輯英寸

回答

0

經過很多更多的思想後,我找到了解決這個問題。我決定構建一個基本上充當用戶和實例之間中介的控制器對象。對於執行的每個$(SELECTOR).plugin(),將爲該實例創建一個控制器,然後該選擇器中的每個元素都將作爲子元素,並可由控制器在給定實例中調用。這與現在API要求放置強制ID的事實相結合,抓住任何單個實例並且它是成員是非常容易的,而實際實例化過程仍然非常簡單,甚至可以是一行代碼。當我把所有的錯誤都解決出來並且我喜歡一個模式時,我會在代碼中進行編輯。

相關問題