Come si scrive SECCO, CoffeeScript modulare con Sprockets in Rails 3.1?
Domanda
Sono nelle prime fasi di provare a scrivere qualche sensata Javascript. Voglio namespace praticamente tutto sotto il nome di mia domanda di variabili globali evitare il più possibile, ma ancora mi danno un modo per accedere a funzioni dichiarate intorno al luogo. Tuttavia, non voglio essere super verbose nelle mie definizioni di funzioni.
Il mio ideale CoffeeScript sarebbe qualcosa di simile a questo:
class @MyApp
@myClassMethod = ->
console.log 'This is MyApp.myClassMethod()'
class @Module1
@moduleMethod = ->
console.log 'This is MyApp.Module1.moduleMethod()'
Si ottiene l'immagine. In questo modo evito di dover MyApp.Module.submoduleMethod = ->
scrivere ogni volta voglio definire una funzione namespace correttamente - utilizzando @
e definire le cose nel la mia definizione di classe mantiene le cose belle e breve
Questo è tutto andando bene fino a quando voglio dividere la mia funzionalità fino in più file CoffeeScript. Poi quello che voglio veramente è qualcosa di simile:
// application.js
class @MyApp
//= require 'module1'
//= require 'module2'
// module1.js
class @Module1
@moduleMethod = ->
console.log 'This is STILL MyApp.Module1.moduleMethod()'
Non sembra come Pignoni può fare questo.
C'è un modo ragionevole per richiedere i miei file CoffeeScript al posto giusto nel mio file contenitore? O un altro modo per scrivere codice approccio modulare che è diviso in file separati utilizzando CoffeeScript, Pignoni e Rails 3.1?
Soluzione
Ho una soluzione modulo che uso nel mio codice.
definisco i miei moduli come qui di seguito
@module "foo", ->
@module "bar", ->
class @Amazing
toString: "ain't it"
stupefacente è disponibile come
foo.bar.Amazing
attuazione della aiutante @modulo è
window.module = (name, fn)->
if not @[name]?
this[name] = {}
if not @[name].module?
@[name].module = window.module
fn.apply(this[name], [])
E 'scritto sul sito web CoffeeScript qui.
https://github.com/jashkenas/coffee- di script / wiki / easy-modules-con-CoffeeScript
Altri suggerimenti
È sufficiente tenere module1.js così com'è e fare application.js aspetto simile a questo:
//= require 'module1'
class @MyApp
...
@Module1 = Module1
Questo funzionerà perché hai fatto un Module1
globale (class @Module1
dichiarando equivale a scrivere @Module1 = class Module1
, e @
punti per window
in quel contesto), e all'interno del corpo class @MyApp
, punti @
alla classe stessa.
Se si desidera Module1
a solo essere una proprietà della classe MyApp
globale dopo che è attaccato, si potrebbe aggiungere la riga
delete window.Module1
Ecco l'utilizzo ho modello modulare per la gestione CoffeeScript con ruote dentate (opere con Rails 4 pure):
# utils.js.coffee
class Utils
constructor: ->
foo: ->
alert('bar!!!')
# private methods should be prefixed with an underscore
_privateFoo: ->
alert('private methods should not be exposed')
instance = new Utils()
# only expose the methods you need to.
# because this is outside of the class,
# you can use coffee's sugar to define on window
@utils = foo: instance.foo
# otherscript.js.coffee
//= require utils
class OtherScript
constructor: ->
@utils.foo() # alerts bar!!!
@utils._privateFoo() # undefined method error
Una disadavantage di questo approccio è che si sta esponendo gli oggetti sulla finestra. L'aggiunta di un caricatore modulo o l'adozione di alcune delle nuove es sintassi moduli intorno potrebbe essere una bella alternativa a seconda delle esigenze.