0

Railsアプリの1つで、「rails-backbone」gemでバックボーンを使用しようとしています。また、うまく機能している足場を使用して1つのモデルを作成しました。しかし、別のモデルがあり、別のルーターを使用しようとしていますが、そのルーターを index.html.erb からインスタンス化しようとすると、 「Uncaught TypeError: undefined is not a function」というエラーが発生し、そのようなルーターが存在しないことを明確に意味します. しかし、それはそこにあり、開発者のツールでもそれらのJSファイルが表示されます。あらゆる方法を試しましたが、うまくいきませんでした。前もって感謝します。

4

1 に答える 1

1

ルーターを次のように定義していると思います。

class SomeRouter extends Backbone.Router
  # router code goes here

そして、次のものを作成しようとしています:

r = new SomeRouter

しかし、CoffeeScript はスコープ クリープを防ぐためにファイルを関数でラップします。

わかりやすくするためにこのドキュメントでは省略していますが、CoffeeScript のすべての出力は無名関数でラップされています。 (function(){ ... })();このセーフティ ラッパーは、キーワードの自動生成と組み合わされて、var偶然にグローバル名前空間を汚染することを非常に困難にします。

他のスクリプトで使用する最上位の変数を作成する場合は、それらをwindowのプロパティとして、またはCommonJSのexportsオブジェクトにアタッチします。存在演算子(以下で説明) を使用すると、それらを追加する場所を特定する信頼できる方法が得られます。CommonJS とブラウザーの両方をターゲットにしている場合:exports ? this

そのラッパーは関数内に隠されるため、それを定義するファイルの外側には表示されSomeRouterません。SomeRouter

Rails/Backbone アプリの一般的な解決策は、名前空間を自分で管理することです。他の (Java|Coffee) スクリプトが取り込まれる前に、独自の名前空間を設定します。

# AppName is just a placeholder, you'd use something more
# sensible in real life.
window.AppName =
    Routers:     { }
    Views:       { }
    Models:      { }
    Collections: { }

次に、ルーターを次のように定義します。

class AppName.Routers.SomeRouter extends Backbone.Router
    #...

以降:

r = new AppName.Routers.SomeRouter

グローバルに表示する必要があるモデル、コレクション、およびビューと同様です。

于 2013-10-21T18:23:41.570 に答える