Я все еще довольно новичок в классической ООП с использованием JavaScript;это кажется общим вопросом ООП, но в идеале я ищу фактический пример кода, использующий CoffeeScript, чтобы помочь мне учиться.
Я хочу определить класс, который может быть создан любой другой функцией / классом, нокоторый выполняет свою основную функциональность только в первый раз, когда он создан.Непосредственным вариантом использования будет класс LoadjQuery
, который может вызываться другим классом, который обрабатывает загрузку jQuery динамически, но только один раз для каждого документа.Код, который вначале создает этот класс, может предоставить опции и настройки (версия jQuery, версия minified / dev и обратный вызов), но любые другие попытки создания экземпляра класса просто вызовут обратный вызов немедленно, если jQuery уже был загружен, или ожидаютчтобы завершить загрузку, затем запустите обратный вызов.
Вот код, который я написал до сих пор (действительный, но не проверенный).Я не уверен, что это самый элегантный способ.Например, есть ли способ избежать использования флага @jquery_loading
и / или setInterval
, ожидающего завершения загрузки jQuery?Первый действительно существует только для предотвращения выполнения кода более одного раза, и это то, что я хотел бы найти более естественный подход, чем полагаться на флаг и условную ветвь.Последнее кажется ненужным и неуклюжим, и я имею в виду такой подход, как очередь _gaq
в Google Analytics (где создается очередь ожидающих операций, и после загрузки библиотеки Google Analytics она работает через очередь; последующие добавленияв очередь, затем обрабатываются немедленно), но я не знаю, как это осуществить, и, возможно, не нужно быть таким изощренным.
# load jQuery dynamically (see: http://code.google.com/apis/libraries/devguide.html#jquery)
class LoadjQuery
@jquery_loading = false
@jquery_loaded = false
constructor: (callback, version = 1, compressed = true) ->
if @jquery_loading # only load once per document
if @jquery_loaded
callback()
else
check_jquery = ->
if @jquery_loaded
clearInterval check_jquery
callback()
setInterval check_jquery, 100
else
@jquery_loading = true # set flag
script = document.createElement 'script'
script.src = "http://ajax.googleapis.com/ajax/libs/jquery/#{version}/jquery#{if compressed then '.min' else ''}.js"
script.onload = -> # set up event handler to ensure that jQuery is loaded before the callback is executed
if not @jquery_loaded
@jquery_loaded = true # set flag
callback()
script.onreadystatechange = -> # alternative event handler needed for Opera and IE
if not @jquery_loaded and (script.readyState is 'loaded' or script.readyState is 'complete')
@jquery_loaded = true # set flag
callback()
(document.getElementsByTagName('head') or document.getElementsByTagName 'body')[0].appendChild script
Может быть, я синглтон?находясь в поиске?Если да, то какова реализация наилучшей практики (я видел несколько разных подходов), и можете ли вы привести пример кода для начала?
Спасибо!