0

関連:Coffeescript'名前空間'内のクラス

その投稿を読んだ後、名前空間関数を取得して、それを独自のファイルに入れました。

namespace.coffee

namespace = (target, name, block) ->
  [target, name, block] = [(if typeof exports isnt 'undefined' then exports else window), arguments...] if arguments.length < 3
  top    = target
  target = target[item] or= {} for item in name.split '.'
  block target, top
  console.log "created namespace "+ name


root = exports ? window
root.namespace = namespace

そしてReplで:

>  namespace = require('./assets/js/namespace.js').namespace
[Function]                                              

toString()なら、それは正しいです。

OK、それで今私はそれを使いたいです:(ns.coffeeサンドロの答えから)

namespace = require('./namespace.js').namespace

class MyFirstClass
  myFunc: () ->
    console.log 'works'

class MySecondClass
  constructor: (@options = {}) ->
  myFunc: () ->
    console.log 'works too'
    console.log @options

namespace "Project.Something", (exports) ->
  exports.MyFirstClass = MyFirstClass
  exports.MySecondClass = MySecondClass
  console.log 'done with exports'

次に、Replで実行します。

ns = require('./ asset / js / ns.js')#
エクスポートでコンパイルされたns.coffeeは、
名前空間Project.Something
{} を作成しました。

動作していないようです:

> ns.MyFirstClass                                              
undefined                                                      
> ns.MySecondClass                                             
undefined                                                      
> ns.Project.Something.MySecondClass                           
TypeError: Cannot read property 'Something' of undefined      

私はここで何か間違ったことをしていますか?

4

1 に答える 1

0

exports変数は、参照元のmodule.exports ファイル用です。したがって、を呼び出すと、 ingから返されるものではなく、ingから返されたnamespaceものが変更されます。exportsrequirenamespacerequirens

namespaceどのように3つの引数を取るかに注意してください。ただし、その最初の行は基本的にtargetオプションになっています。target(おそらく必要な場合exports、またはこれをサーバーとクライアントの両方で実行する必要がある場合)を渡すと、exports ? window必要な処理が実行されます。

于 2013-02-07T00:45:07.790 に答える