1

コードの名前空間を作成しようとする前に、これを生成する2つのcoffeescriptファイルをrailsプロジェクトに入れます。

(function(){
  window.Investments = {};
}).call(this);

次に、私のバックボーンコレクション:

(function(){
  Investments.InfrastructureCollection = Backbone.Collection.extend({});
}).call(this);

Uncaught ReferenceError: Investments is not definedChromeのコンソールは、ページの読み込み時にInfrastructureCollectionを設定した場所をスローしますが、すべてが正常に実行され、正常に読み込まれます。コレクションの新しいインスタンスを作成し、何も設定しなくてもコンソールにモデルを追加することもできます。エラーをスローするために、コンソールで何が起こっていますか?

4

3 に答える 3

1

最初に確認することは、これが機能するかどうかを確認することです。

var Investments = {};
Investments.InfrastructureCollection = Backbone.Collection.extend({});

その周りの他のすべてのものなしで。そして、それが機能しない場合は、これが機能するかどうかを確認します。

window.Investments = {};
window.Investments.InfrastructureCollection = Backbone.Collection.extend({});

これらは、.Investmentsオブジェクトの作成が適切に行われていること、またはそれに問題があったかどうかを確認します。

次に、最後に、これを2つの別々のインスタンス内で実行する理由はわかりません。

(function(){

}).call(this);

すぐに実行される関数は通常、プライバシーまたはローカル変数の一時スコープを作成するために使用されますが、それらがないため、そのために必要ありません。第二に、なぜ.call(this)。繰り返しになりますが、これは余分な量のコードであり、まったく使用されていません。そのままにしておきたい場合thisは、最初にすぐに実行される関数ブロックを削除してください。

それでもこれを理解できない場合は、jsFiddleで簡単な再現可能な例を作成してみてください。そうすれば、何が起こっているのかをより正確に確認できます。

于 2013-03-11T16:41:47.487 に答える
0

これらをどのコンテキストで呼び出しているか(つまり、呼び出しで何thisを参照しているのか)はわかりませんが、おそらく次のように変更する必要があります。

(function(context){
  context.Investments = {};
}).call(window);

また、InfrastructureCollectionにアクセスする前に投資を宣言できない理由もわかりません

Investments = {};
Investments.InfrastructureCollection = Backbone.Collection.extend({});
于 2013-03-11T16:43:44.900 に答える
0

このように自己呼び出し機能の順番を守っていれば大丈夫です。名前空間の宣言は、明らかに最初に。の前に来る必要がありますCollection, Model, etc.

/**Initialize namespace */
(function(){
    window.Investments = {};
}).call(this);

/** Collection */
(function(){
    Investments.Collection = Backbone.Collection.extend({});
}).call(this);

/** Model */
(function(){
    Investments.Model = Backbone.Model.extend({});
}).call(this);

または、匿名関数をそのまま呼び出し、Investmentsオブジェクトを挿入して、それが実際にスコープ内にあることを確認します(特定のオブジェクトが存在するかどうかを追加でチェックする必要があります)。

/**Initialize namespace */
(function(){
    window.Investments = {};
})();

/** Collection */
(function(inv){
    inv.Collection = Backbone.Collection.extend({});
})(window.Investments || {});

/** Model */
(function(inv){
    inv.Model = Backbone.Model.extend({});
})(window.Investments || {});

Another option that you can take if you're worried about the order or your modules is to use an AMD framework like Require JS so you don't have to worry about it and you can configure dependencies and it will just run.

于 2013-03-11T17:54:55.640 に答える