0

Backbone /RequireJsjavascriptスタックを使用しています。私が達成したいのは、依存関係が設定された後、のModel依存関係を動的に要求することです。Backbone.CollectionCollection

Collection私はそれをできるだけ一般的に保ちたいと思います、そして私Modelsは主な現在の文脈に応じて異なるそして残りのURLを割り当てたいです。目標は、特定のコンテキストで必要なものだけをロードすることです。

window.Collection = Backbone.Collection.extend({

    initialize: function(modelName,apiRoute){

        this.modelName = modelName;
        this.apiRoute = apiRoute;

        if (typeof(window[this.modelName]) === "function") { 
            this.model = window[this.modelName];
            this.url = "./api/" + this.apiRoute;
        }
    }
...

ここでの問題はwindow[this.modelName]、メインコンテキストの依存関係を依存関係の前にロードする必要があることCollectionです。

オブジェクトMainContextにコレクションが必要だとします。

// MainContext.js    
define([ 
     ...
     "model/Collection"

そして内部で、コレクションに必要な依存関係の名前値に必要な変数をMainContext解決します(e。' ')。MainContext内にある場合、その依存関係ファイルのロードが遅すぎます。modelNameToysrequire(['model/Toys'])

そのような場合のアプローチは何でしょうか?感謝。

4

1 に答える 1

2

標準のRequire.js循環依存関係を説明しているようです。つまり、Toysに依存するコレクションがありますが、他の1つまたは複数のモジュールがそれを不可能にしています。

あなたがほのめかしたこれに対する標準的な解決策は、requireの同期形式を使用することです。require(['model/Toys'])。ただし、読み込みMainContext時間までに読み込まれていないため、挿入するのは間違った方法のようMainContextです。

これを回避する方法は、ロード時に同期requireを必要としない場所で同期requireを使用することです。これは、コレクションのように聞こえます。コレクションにはモデルが必要ですが、実行時(特に実行時initialize)にモデルが必要です。コードを次のように変更した場合:

window.Collection = Backbone.Collection.extend({

    initialize: function(modelName,apiRoute){

        this.modelName = modelName;
        this.apiRoute = apiRoute;

        if (typeof(window[this.modelName]) === "function") { 
            this.model = require('model/' + this.modelName);
            this.url = "./api/" + this.apiRoute;
        }
    }
....

初期化が実行されるまでに、モデルはすでにロードされているはずです。

お役に立てば幸いです。

于 2013-03-25T20:16:13.823 に答える