2

私は jQuery と組み合わせて CoffeeScript クラスを使用しており、別の HTML ページを ajax を介して読み込んでいます。このページは別の JavaScript を参照していますが、ajax で読み込まれたページを取得して、親ページによってスクリプトに読み込まれたクラスを確認するのに問題があります。

親ページは、javascript ファイル (CoffeeScript からコンパイル) をロードします。

<script src="/assets/global.js?body=1" type="text/javascript"></script>

CoffeeScript ファイルには、次のクラスがあります。

class App
  constructor: ->
    ...

次を使用して別の Web ページを読み込んでいます。

$.ajax({
  url: '/import/show', 
  success: (data) =>
    $('#content').html(data)
})

このページは、別の Coffee/JavaScript ファイルを参照しています。

<script src="/assets/import.show.js?body=1" type="text/javascript"></script>

この読み込まれた JavaScript ファイルに次のものが含まれている場合:

alert('test')

予想どおり、アラートが発生します。これは、読み込みコードが正しく機能していることを示しています。ただし、子スクリプトに次が含まれている場合:

app = new App()

エラーが発生します:

Uncaught ReferenceError: App is not defined

これは、コードをドキュメント対応関数内に配置した場合にも発生します。

$(=> a = new App())

親ページによってロードされたスクリプトのクラスを、ajax経由でロードされた子ページによってロードされたスクリプトで使用できるようにする方法を知っている人はいますか?

4

2 に答える 2

6

クラス名の前に @ を付けるだけです。

class @App

これにより、次のものが生成されます。

(function() {
    this.App = (function() {
    ...

window がthisのときにクラスを定義するため、グローバルにアクセスできます。

于 2013-05-18T09:49:27.570 に答える
0

なぜこれが起こっているのかを発見し、回避策を見つけたと思います。コンパイルされたスクリプト (CoffeeScript ではなく) を見ると、次のことがわかりました。

(function() {
    var App
    App = (function() {
    ...

次に、「class App」がクラスを関数内の var として定義していることに気付きました。これは、その CoffeeScript ファイル内からのみアクセスできることを意味します。

回避策は、クラスを次のように定義することです。

class window.App
  constructor: ->
    ...

これにより、クラスのスコープがウィンドウ DOM オブジェクトに設定され、ajax で読み込まれたスクリプト内からアクセスできるようになります。

これを行うためのより良い方法があるかどうか、またはこれが正しいアプローチのように思われるかどうかを誰かが知っていますか?

于 2013-02-02T21:57:31.020 に答える