2009-06-17 34 views
7

我正在寫一個小型的CMS作爲jQuery AJAX插件,雖然它絕不是過長(目前​​約500行),但我可以看到它將很高興能夠將其拆分成單獨的文件,一個用於每個「子類」:如何在多個文件中拆分jQuery插件

(function($) { 
    $.fn.myCMS = function() { 
     this.classOne = function() { 
     ... 
     } 
     this.classTwo = function() { 
     ... 
     } 
    } 
})(jQuery); 

在上面的例子,我想放的代碼classOne在一個文件中,在classTwo另一個並且在第三的myCMS「基類」。是否有可能通過類似的東西(在每個「子類」文件中)實現這一點?

$.extend(myCMS,classOne = function() { 
... 
}) 

非常感謝,

JS

回答

6

你要關切的私人範圍/分離添加到 「插件」。這對於基於插件的Web應用程序的維護和長期可擴展性非常重要,無論所有內容是被內置到一個文件還是多個文件中。

可以創建私人範圍和由直接連接方法或通過向jQuery.fn.foo方法的原型擴展現有jQuery.fn方法

(function ($) { 

    // instance method attached to the constructor function 
    $.fn.myCMS.classOne = function() { 

    }; 

    // or "shared" method attached to prototype 
    $.fn.myCMS.prototype.classOne = function() { 

    }; 

})(jQuery); 

可以使用jQuery.extend(),在這種情況下,它實際上是一個「簡寫」,用於將方法添加到構造函數實例中作爲上面的第一種方法。你必須封裝要添加到任何對象(通常這將是一個匿名的對象):如果你有需要在同一合攏變量得到頻繁「類」

$.extend($.fn.myCMS,{ classOne: function() { } }); 

從設計的角度來看,他們應該可能是同一個函數作用域/閉包的一部分,或者你應該爲那些被關閉的變量公開getter和setter(或許使用_foo約定來表明它們只能被你的代碼使用)。

(function ($) { 

    var foo = "foo!"; 

    // combined getter/setter 
    // could also check arguments.length 
    $.fn.myCMS._foo = function (value) { 
      if (typeof(value) != "undefined") { 
       foo = value; 
      } else { 
       return foo; 
      } 
    }; 

)(jQuery); 

如果你想成爲一名黑客,你需要在合攏變量從不同範圍,以獲得,我相信你可以通過使用.CALL()或。適用執行與自己的範圍,這些新方法,這樣做()從另一個範圍。我可以嘗試掀起一些關於它如何工作的示例,但如果您自己研究範圍解析在這些情況下的工作方式,這將是一個好主意。

我相信你可以通過使用with($ .fn.myCMS){}構造從原始的「插件」方法中「借用」範圍,但我並不是100%肯定的,因爲我沒有做到這一點我自己,只有閱讀它。

1

這將有助於也看看jQuery的ui代碼。例如,progressbar插件需要三個文件ui.core,ui.widget和ui.progressbar。下載jQuery UI源包並查看demos目錄下的進度條示例。 (我找不到任何地方託管的簡化版本,但源碼包有簡化示例)