3

Backbone is not definedバックボーンを使用するコード内のさまざまな場所から非決定論的にエラーを取得するバックボーンアプリがあります。最初に読み込まれ、サイトが読み込まれる場合と、読み込まれない場合があります。私はmain.jsとして以下を使用しています:

require.config({
  paths: {
    jqueryui: 'libs/jquery/jquery-ui',
    underscore: 'libs/underscore/underscore-min',
    backbone: 'libs/backbone/backbone-min',
    text: 'libs/require/text',
    order: 'libs/require/order',
    searchcollector: 'libs/jquery/searchcollector.plugin',
    guiders: 'libs/jquery/guiders'
  },
  shim: {
    'underscore': {
      exports: '_'
    },
    'backbone': {
      deps: ['underscore'],
      exports: 'Backbone'
    }
  }
});

require([
  'views/app',
  'helpers'
], function(app) {
  var app = window.app = new app();
});

使っています

<script data-main="/assets/js/main" src="/assets/js/libs/require/require-jquery.js"></script>

私のHTMLでは、jQueryにrequireが読み込まれます。私はこの(http://stackoverflow.com/questions/8131265/loading-backbone-and-underscore-using-requirejs)SOスレッドからこのアドバイスを受けましたが、何も機能していないようです。シムは最初にバックボーンをロードしてから、グローバルに利用できるようにするべきではありませんか?助けていただければ幸いです。

4

2 に答える 2

3

これが正しい答えかどうかはわかりませんが、バックボーンの依存関係として jquery をリストしていないことに気付きました。Backbone は唯一のハードな依存関係として Underscore を挙げていますが、Backbone.View が動作するには jquery または zepto が必要です。

しかし、なぜ、それが時々うまくいくように見えるのでしょうか?

jQuery は AMD モジュールであるため、ロード時に最初にロードされる場合とロードされない場合があります。Backbone の前にロードすると、利用可能になり、Backbone は満足します。そうしないと、おそらく悪い結果が得られます。

次のようなことを試してください:

あなたのパスにこれを追加してください:

jquery: 'libs/require/require-jquery'

そしてあなたのシムに、これを追加してください:

'backbone': {
  deps: ['underscore', 'jquery'],
  exports: 'Backbone'
}

その結果得られたものを教えてください。私はrequirejs2.0のshim機能を使ったことがないので、深いところを正しく理解できているか気になります。

于 2012-08-14T01:41:55.190 に答える
0

私の意見では、require と jquery を同じファイルにロードするのは少しハックです。

そして、アンダースコアにはjqueryが必要なため、バックボーンのdepsとしてjqueryを設定するのはfalseであり、バックボーンの前にロードされるため、正しい方法は次のようになります

require.config({
  paths: {
     'jquery': 'path to jquery'
    ,'underscore': 'path to underscore'
    ,'backbone': 'path to backbone'
    **other paths...**
  }
  ,shim: {
     jquery: {
      exports: '$'
    }
    ,'underscore': {
      deps: [ 'jquery' ]
      ,exports: '_'
    }
    ,'backbone': {
      deps: [ 'underscore' ]
      ,exports: 'Backbone'
    }
  }
});

最後に、タグスクリプトは次のようになります

<script data-main="/assets/js/main" src="/assets/js/libs/require.js">
</script>

次に、このように必要なlibを呼び出すだけです

define( [ 'jquery', 'underscore', 'backbone' ],
  function( $, _, Backbone )
  {
    // stuff
  } );

モデルの場合、jquery とアンダースコアは必要ないので、Backbone を呼び出すだけで機能します

define( [ 'backbone' ],
  function( Backbone )
  {
    // Backbone.extend ?
  } );
于 2013-11-19T12:30:21.870 に答える