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