2010-04-27 19 views
5

我很好奇如何指定選項到一個jQuery插件的方式,有些是必需的,有些可以覆蓋,有些不能被觸摸。jQuery插件選項:必需,可選,無法訪問

我開始了與平常:

jQuery.fn.plugin = function (options){ 
    var defaults = { username: "", posts:10, api: "http://myapi.com" } 
    var settings = jQuery.extend({}, defaults, options); 
} 

比方說,我想username被需要,posts是可選的(默認爲10)和你(你是該插件的用戶)無法修改api,即使他們嘗試。理想情況下,它們仍然處於相同的數據結構中,而不是分割成單獨的對象。想法?

回答

1

如果你想要用戶名是必需的,我會讓它成爲一個參數,因爲它是唯一需要的東西,並且你不想用這種方法做20個參數。事情是這樣的:

jQuery.fn.plugin = function (username, options){ 
    var defaults = { posts:10, api: "http://myapi.com" } 
    var settings = jQuery.extend({}, defaults, options); 
} 

這裏沒有一個乾淨的需要辦法做到這一點完全在一個傳遞的對象,至少不是一個簡單的,這是你想要什麼的API。另一種方法是指定沒有默認和警報或東西,如果它不存在,我想:

jQuery.fn.plugin = function (options){ 
    var defaults = { posts:10, api: "http://myapi.com" } 
    var settings = jQuery.extend({}, defaults, options); 
    if(typeof options.username == 'undefined') { 
    alert("You must specify a username"); 
    return this; 
    } 
} 

編輯 - 錯過了問題的一部分,爲交通不便的人,要麼有硬編碼的值,因爲這是相同的結果,或者一點點清潔將是您的插件內的其他地方超出範圍的內部對象。再次,不平凡的同一對象上做,除非你一直說一個intenalDefaults對象,並使用它叫jQuery.extend()後擴展它們,讓它們將覆蓋任何東西的消費者中傳遞的設置。

5
$.fn.plugin = function(username, options) { 
    if (!username) throw "Must provide a username."; 

    var config = $.extend({}, $.fn.plugin.defaults, options); 

    var privateVal = 4; 
    ... 
} 

$.fn.plugin.defaults = { 
    posts: 10 
} 

這裏有一個總結:

  • 需要的參數通常作爲正常的有序參數通常是最明顯的傳遞。如果有太多這樣的結構考慮某種結構 - 或者更好的 - 採用不同的API。
  • 選項最容易通過選項散列指定爲最後一個參數。一般來說,這些應該是可選的,但是如果它們丟失,肯定有可能拋出錯誤。
  • 使用jQuery的extend函數填寫默認值。你通常會有一些「默認值」來收集這些信息。我喜歡將這些範圍限定在名稱間距的插件名稱本身以及有用的可用選項的文檔中。
  • 一般throw如果缺少必需的參數。
  • 如果你有你不想讓調用者搞亂的值,在你的插件中定義它們,在Javascript的範圍內可以防止調用者搞砸他們。
相關問題