15

私は、実用的な Javascript を作成しようとしている初期段階にいます。基本的に、アプリケーションの名前の下にすべての名前空間を作成して、グローバルをできるだけ回避しますが、その場所で宣言された関数にアクセスする方法を提供します。ただし、関数定義で非常に冗長になりたくありません。

私の理想の CoffeeScript は次のようなものです。

class @MyApp
  @myClassMethod = ->
    console.log 'This is MyApp.myClassMethod()'

  class @Module1
    @moduleMethod = ->
      console.log 'This is MyApp.Module1.moduleMethod()'

あなたは絵を手に入れます。このようにしてMyApp.Module.submoduleMethod = ->、名前空間付き関数を適切に定義するたびに記述する必要がなくなります。クラス定義内で@使用および定義することで、物事が簡潔に保たれます。

機能を複数の CoffeeScript ファイルに分割するまで、これはすべてうまくいっています。次に、私が本当に欲しいのは次のようなものです:

// application.js
class @MyApp
  //= require 'module1'
  //= require 'module2'

// module1.js
class @Module1
  @moduleMethod = ->
    console.log 'This is STILL MyApp.Module1.moduleMethod()'

スプロケットがこれを行うことができるようには見えません。

私のコンテナファイルの正しい場所に私のCoffeeScriptファイルを要求する賢明な方法はありますか? または、CoffeeScript、Sprockets、および Rails 3.1 を使用して、個別のファイルに分割されたモジュラー コードを作成する別の方法はありますか?

4

3 に答える 3

4

module1.js をそのままにして、application.js を次のようにします。

//= require 'module1'

class @MyApp
  ...

  @Module1 = Module1

これはModule1、グローバルを作成し (宣言class @Module1は を書くことと同等@Module1 = class Module1であり、そのコンテキストでは を@指すwindow)、class @MyApp本体内@でクラス自体を指すため、機能します。

Module1アタッチされた後にのみグローバル クラスのプロパティになりたい場合はMyApp、次の行を追加できます。

delete window.Module1
于 2011-07-25T14:24:12.897 に答える
3

コードで使用するモジュール ソリューションがあります。

以下のようにモジュールを定義します

@module "foo", ->
    @module "bar", ->
        class @Amazing
            toString: "ain't it"

Amazingは次のように利用できます

foo.bar.Amazing

@module ヘルパーの実装は

window.module = (name, fn)->
  if not @[name]?
    this[name] = {}
  if not @[name].module?
    @[name].module = window.module
  fn.apply(this[name], [])

それはここのcoffeescriptウェブサイトに書かれています。

https://github.com/jashkenas/coffee-script/wiki/Easy-modules-with-coffeescript

于 2011-07-26T06:47:30.533 に答える
1

スプロケットを使用して coffeescript を管理するために使用するモジュラー パターンを次に示します (Rails 4 でも動作します)。

  # 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

このアプローチの欠点の 1 つは、オブジェクトをウィンドウに公開していることです。モジュールローダーを追加するか、モジュールの周りに新しい es 構文を採用することは、ニーズに応じて優れた代替手段になる可能性があります。

于 2013-09-08T19:02:04.477 に答える