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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top